From bf628be4bffca6195dde1926e90211e3c5dc54b6 Mon Sep 17 00:00:00 2001 From: Keong Lim Date: Thu, 21 Mar 2019 15:33:44 +1100 Subject: AAI-1523 Batch reformat aai-core Use maven plugins from AAI-2198 to do batch reformat of aai-core to consistent code style. Change-Id: If43889a61778f3a766c3663098064cdcc8e507bf Issue-ID: AAI-1523 Signed-off-by: Keong Lim --- .../java/org/onap/aai/audit/ListEndpoints.java | 535 +++-- .../main/java/org/onap/aai/auth/AAIAuthCore.java | 630 +++--- .../src/main/java/org/onap/aai/auth/AAIUser.java | 1 + .../AAIUnrecognizedFunctionException.java | 6 +- .../java/org/onap/aai/concurrent/AaiCallable.java | 35 +- .../aai/config/AuthorizationConfiguration.java | 3 +- .../org/onap/aai/config/IntrospectionConfig.java | 20 +- .../java/org/onap/aai/config/RestBeanConfig.java | 9 +- .../org/onap/aai/config/SchemaConfiguration.java | 43 +- .../org/onap/aai/config/SpringContextAware.java | 27 +- .../main/java/org/onap/aai/db/DbMethHelper.java | 229 +- .../java/org/onap/aai/db/props/AAIProperties.java | 5 +- .../java/org/onap/aai/dbgen/GraphSONPartialIO.java | 30 +- .../org/onap/aai/dbgen/GraphSONPartialReader.java | 282 +-- .../java/org/onap/aai/dbgen/PropertyLimitDesc.java | 5 +- .../java/org/onap/aai/dbgen/SchemaGenerator.java | 287 +-- .../src/main/java/org/onap/aai/dbmap/AAIGraph.java | 51 +- .../java/org/onap/aai/dbmap/AAIGraphConfig.java | 102 +- .../java/org/onap/aai/dbmap/DBConnectionType.java | 4 +- .../java/org/onap/aai/dbmap/InMemoryGraph.java | 220 +- .../onap/aai/dmaap/AAIDmaapEventJMSConsumer.java | 18 +- .../onap/aai/dmaap/AAIDmaapEventJMSProducer.java | 8 +- .../java/org/onap/aai/dmaap/MessageProducer.java | 1 + .../org/onap/aai/domain/model/AAIResource.java | 1294 +++++------ .../org/onap/aai/domain/model/AAIResourceKey.java | 155 +- .../org/onap/aai/domain/model/AAIResourceKeys.java | 25 +- .../org/onap/aai/domain/model/AAIResources.java | 114 +- .../notificationEvent/NotificationEvent.java | 241 +- .../domain/notificationEvent/ObjectFactory.java | 27 +- .../domain/responseMessage/AAIResponseMessage.java | 164 +- .../responseMessage/AAIResponseMessageData.java | 7 +- .../responseMessage/AAIResponseMessageDatum.java | 80 +- .../responseMessage/AAIResponseMessages.java | 65 +- .../aai/domain/responseMessage/package-info.java | 15 +- .../onap/aai/domain/restPolicyException/Fault.java | 111 +- .../domain/restPolicyException/ObjectFactory.java | 27 +- .../restPolicyException/PolicyException.java | 31 +- .../domain/restPolicyException/RESTResponse.java | 17 +- .../domain/restPolicyException/RequestError.java | 18 +- .../org/onap/aai/domain/restResponseInfo/Info.java | 102 +- .../aai/domain/restResponseInfo/ObjectFactory.java | 27 +- .../aai/domain/restServiceException/Fault.java | 111 +- .../domain/restServiceException/ObjectFactory.java | 27 +- .../domain/restServiceException/RESTResponse.java | 17 +- .../domain/restServiceException/RequestError.java | 17 +- .../restServiceException/ServiceException.java | 31 +- .../aai/domain/translog/TransactionLogEntries.java | 15 +- .../aai/domain/translog/TransactionLogEntry.java | 791 ++++--- .../java/org/onap/aai/exceptions/AAIException.java | 33 +- .../onap/aai/exceptions/AAIExceptionWithInfo.java | 204 +- .../org/onap/aai/extensions/AAIExtensionMap.java | 1587 +++++++------- .../onap/aai/extensions/ExtensionController.java | 222 +- .../aai/extensions/OrphanLInterfaceHandler.java | 145 +- .../onap/aai/ingestModel/CreateWidgetModels.java | 224 +- .../org/onap/aai/introspection/Introspector.java | 1198 +++++----- .../aai/introspection/IntrospectorFactory.java | 69 +- .../onap/aai/introspection/IntrospectorWalker.java | 326 +-- .../org/onap/aai/introspection/JSONStrategy.java | 663 +++--- .../java/org/onap/aai/introspection/Loader.java | 149 +- .../org/onap/aai/introspection/LoaderFactory.java | 69 +- .../org/onap/aai/introspection/LoaderUtil.java | 5 +- .../aai/introspection/MarshallerProperties.java | 225 +- .../java/org/onap/aai/introspection/ModelType.java | 3 +- .../org/onap/aai/introspection/MoxyLoader.java | 318 +-- .../org/onap/aai/introspection/MoxyStrategy.java | 590 +++-- .../onap/aai/introspection/PropertyPredicate.java | 1 + .../onap/aai/introspection/PropertyPredicates.java | 99 +- .../org/onap/aai/introspection/Visibility.java | 6 +- .../java/org/onap/aai/introspection/Wanderer.java | 114 +- .../exceptions/AAIUnknownObjectException.java | 24 +- .../exceptions/AAIUnmarshallingException.java | 24 +- .../aai/introspection/generator/CreateExample.java | 276 +-- .../aai/introspection/sideeffect/DataCopy.java | 104 +- .../introspection/sideeffect/DataLinkReader.java | 121 +- .../introspection/sideeffect/DataLinkWriter.java | 143 +- .../aai/introspection/sideeffect/PrivateEdge.java | 83 +- .../aai/introspection/sideeffect/SideEffect.java | 214 +- .../introspection/sideeffect/SideEffectRunner.java | 138 +- .../sideeffect/SideEffectRunnerHelper.java | 109 +- .../AAIMissingRequiredPropertyException.java | 26 +- .../exceptions/AAIMultiplePropertiesException.java | 27 +- .../onap/aai/introspection/tools/CreateUUID.java | 56 +- .../aai/introspection/tools/DefaultFields.java | 39 +- .../aai/introspection/tools/InjectKeysFromURI.java | 79 +- .../introspection/tools/IntrospectorValidator.java | 573 ++--- .../org/onap/aai/introspection/tools/Issue.java | 234 +- .../aai/introspection/tools/IssueResolver.java | 16 +- .../onap/aai/introspection/tools/IssueType.java | 3 +- .../tools/RemoveNonVisibleProperty.java | 19 +- .../org/onap/aai/introspection/tools/Severity.java | 5 +- .../src/main/java/org/onap/aai/logging/CNName.java | 101 +- .../onap/aai/logging/CustomLogPatternLayout.java | 9 +- .../aai/logging/CustomLogPatternLayoutEncoder.java | 25 +- .../java/org/onap/aai/logging/DME2RestFlag.java | 49 +- .../org/onap/aai/logging/EcompElapsedTime.java | 60 +- .../java/org/onap/aai/logging/EcompEncoder.java | 1 + .../org/onap/aai/logging/EcompErrorCategory.java | 30 +- .../org/onap/aai/logging/EcompPatternLayout.java | 21 +- .../org/onap/aai/logging/EcompResponseCode.java | 21 +- .../onap/aai/logging/EcompResponseDescription.java | 36 +- .../org/onap/aai/logging/EcompServiceName.java | 3 +- .../java/org/onap/aai/logging/EcompStartTime.java | 19 +- .../java/org/onap/aai/logging/EcompStatusCode.java | 5 +- .../org/onap/aai/logging/EelfClassOfCaller.java | 9 +- .../java/org/onap/aai/logging/ErrorLogHelper.java | 1143 +++++----- .../java/org/onap/aai/logging/ErrorObject.java | 648 +++--- .../aai/logging/ErrorObjectFormatException.java | 9 +- .../aai/logging/ErrorObjectNotFoundException.java | 53 +- .../java/org/onap/aai/logging/LogFormatTools.java | 176 +- .../java/org/onap/aai/logging/LoggingContext.java | 762 ++++--- .../logging/LoggingContextNotExistsException.java | 3 +- .../main/java/org/onap/aai/logging/StopWatch.java | 55 +- .../aai/logging/StopWatchNotStartedException.java | 27 +- .../exceptions/AAIIdentityMapParseException.java | 23 +- .../exceptions/AmbiguousMapAAIException.java | 29 +- .../DoesNotStartWithValidNamespaceException.java | 24 +- .../onap/aai/parsers/query/LegacyQueryParser.java | 390 ++-- .../aai/parsers/query/ObjectNameQueryParser.java | 11 +- .../org/onap/aai/parsers/query/QueryParser.java | 227 +- .../aai/parsers/query/QueryParserStrategy.java | 118 +- .../aai/parsers/query/RelationshipQueryParser.java | 77 +- .../onap/aai/parsers/query/TraversalStrategy.java | 88 +- .../query/UniqueRelationshipQueryParser.java | 45 +- .../org/onap/aai/parsers/query/UniqueStrategy.java | 91 +- .../aai/parsers/query/UniqueURIQueryParser.java | 257 +-- .../parsers/relationship/RelationshipToURI.java | 484 ++-- .../java/org/onap/aai/parsers/uri/Parsable.java | 81 +- .../java/org/onap/aai/parsers/uri/URIParser.java | 475 ++-- .../java/org/onap/aai/parsers/uri/URIToDBKey.java | 143 +- .../aai/parsers/uri/URIToExtensionInformation.java | 274 +-- .../java/org/onap/aai/parsers/uri/URIToObject.java | 366 ++-- .../aai/parsers/uri/URIToRelationshipObject.java | 256 +-- .../java/org/onap/aai/parsers/uri/URIValidate.java | 69 +- .../aai/query/builder/GraphTraversalBuilder.java | 1580 +++++++------- .../aai/query/builder/GremlinQueryBuilder.java | 148 +- .../onap/aai/query/builder/GremlinTraversal.java | 198 +- .../org/onap/aai/query/builder/GremlinUnique.java | 198 +- .../query/builder/MissingOptionalParameter.java | 18 +- .../org/onap/aai/query/builder/QueryBuilder.java | 1157 +++++----- .../org/onap/aai/query/builder/TraversalQuery.java | 242 +- .../query/builder/TraversalURIOptimizedQuery.java | 235 +- .../java/org/onap/aai/rest/RestHandlerService.java | 6 +- .../main/java/org/onap/aai/rest/RestTokens.java | 19 +- .../main/java/org/onap/aai/rest/db/DBRequest.java | 425 ++-- .../main/java/org/onap/aai/rest/db/HttpEntry.java | 2302 ++++++++++---------- .../org/onap/aai/rest/ueb/NotificationEvent.java | 126 +- .../org/onap/aai/rest/ueb/UEBNotification.java | 294 +-- .../restcore/CustomJacksonJaxBJsonProvider.java | 61 +- .../java/org/onap/aai/restcore/HttpMethod.java | 9 +- .../JettyObfuscationConversionCommandLineUtil.java | 93 +- .../main/java/org/onap/aai/restcore/MediaType.java | 32 +- .../main/java/org/onap/aai/restcore/RESTAPI.java | 666 +++--- .../restcore/search/AAIAbstractGroovyShell.java | 79 +- .../aai/restcore/search/GremlinGroovyShell.java | 50 +- .../aai/restcore/search/GroovyQueryBuilder.java | 59 +- .../java/org/onap/aai/restcore/util/URITools.java | 147 +- .../onap/aai/serialization/db/DBSerializer.java | 734 ++++--- .../onap/aai/serialization/db/DeleteSemantic.java | 23 +- .../onap/aai/serialization/db/EdgeProperties.java | 27 +- .../onap/aai/serialization/db/EdgePropertyMap.java | 60 +- .../onap/aai/serialization/db/EdgeSerializer.java | 455 ++-- .../org/onap/aai/serialization/db/GetAllPool.java | 37 +- .../onap/aai/serialization/db/GraphSingleton.java | 77 +- .../serialization/db/InMemoryGraphSingleton.java | 64 +- .../aai/serialization/db/JanusGraphSingleton.java | 25 +- .../db/exceptions/EdgeMultiplicityException.java | 21 +- .../exceptions/MultipleEdgeRuleFoundException.java | 21 +- .../db/exceptions/NoEdgeRuleFoundException.java | 23 +- .../serialization/engines/InMemoryDBEngine.java | 335 ++- .../serialization/engines/JanusGraphDBEngine.java | 133 +- .../onap/aai/serialization/engines/QueryStyle.java | 3 +- .../engines/TransactionalGraphEngine.java | 427 ++-- .../engines/query/GraphTraversalQueryEngine.java | 332 ++- .../engines/query/GremlinPipelineQueryEngine.java | 365 ++-- .../engines/query/GremlinQueryEngine.java | 345 +-- .../serialization/engines/query/QueryEngine.java | 242 +- .../aai/serialization/queryformats/Console.java | 30 +- .../onap/aai/serialization/queryformats/Count.java | 93 +- .../aai/serialization/queryformats/Format.java | 27 +- .../serialization/queryformats/FormatFactory.java | 131 +- .../serialization/queryformats/FormatMapper.java | 12 +- .../aai/serialization/queryformats/Formatter.java | 123 +- .../aai/serialization/queryformats/GraphSON.java | 187 +- .../onap/aai/serialization/queryformats/IdURL.java | 61 +- .../queryformats/MultiFormatMapper.java | 152 +- .../aai/serialization/queryformats/PathedURL.java | 60 +- .../aai/serialization/queryformats/RawFormat.java | 348 +-- .../aai/serialization/queryformats/Resource.java | 267 +-- .../queryformats/ResourceWithSoT.java | 19 +- .../serialization/queryformats/SimpleFormat.java | 109 +- .../serialization/queryformats/SubGraphStyle.java | 5 +- .../AAIFormatQueryResultFormatNotSupported.java | 24 +- .../exceptions/AAIFormatVertexException.java | 24 +- .../exceptions/QueryParamInjectionException.java | 21 +- .../serialization/queryformats/params/Depth.java | 5 +- .../serialization/queryformats/params/Inject.java | 12 +- .../queryformats/params/NodesOnly.java | 5 +- .../serialization/queryformats/params/Setter.java | 1 + .../queryformats/utils/QueryParamInjector.java | 94 +- .../queryformats/utils/UrlBuilder.java | 129 +- .../serialization/tinkerpop/TreeBackedEdge.java | 78 +- .../serialization/tinkerpop/TreeBackedVertex.java | 245 ++- .../onap/aai/service/NodeValidationService.java | 15 +- .../java/org/onap/aai/tasks/ScheduledTasks.java | 109 +- .../src/main/java/org/onap/aai/util/AAIConfig.java | 205 +- .../aai/util/AAIConfigCommandLinePropGetter.java | 58 +- .../main/java/org/onap/aai/util/AAIConstants.java | 20 +- .../java/org/onap/aai/util/AAISystemExitUtil.java | 19 +- .../src/main/java/org/onap/aai/util/AAIUtils.java | 5 +- .../src/main/java/org/onap/aai/util/Entity.java | 44 +- .../main/java/org/onap/aai/util/EntityList.java | 25 +- .../main/java/org/onap/aai/util/FileWatcher.java | 60 +- .../main/java/org/onap/aai/util/FormatDate.java | 36 +- .../java/org/onap/aai/util/HbaseSaltPrefixer.java | 60 +- .../java/org/onap/aai/util/HttpsAuthClient.java | 201 +- .../org/onap/aai/util/HttpsAuthExternalClient.java | 150 +- .../JettyObfuscationConversionCommandLineUtil.java | 83 +- .../main/java/org/onap/aai/util/KeyValueList.java | 26 +- .../main/java/org/onap/aai/util/MapperUtil.java | 6 +- .../src/main/java/org/onap/aai/util/PojoUtils.java | 626 +++--- .../src/main/java/org/onap/aai/util/Request.java | 242 +- .../java/org/onap/aai/util/RestController.java | 1098 +++++----- .../org/onap/aai/util/RestControllerInterface.java | 14 +- .../main/java/org/onap/aai/util/RestObject.java | 22 +- .../java/org/onap/aai/util/RestURLEncoder.java | 25 +- .../org/onap/aai/util/StoreNotificationEvent.java | 623 +++--- .../main/java/org/onap/aai/web/DmaapConfig.java | 19 +- .../org/onap/aai/web/EventClientPublisher.java | 21 +- .../org/onap/aai/workarounds/NamingExceptions.java | 109 +- 229 files changed, 19972 insertions(+), 19540 deletions(-) (limited to 'aai-core/src/main') diff --git a/aai-core/src/main/java/org/onap/aai/audit/ListEndpoints.java b/aai-core/src/main/java/org/onap/aai/audit/ListEndpoints.java index fc383581..aed61e7a 100644 --- a/aai-core/src/main/java/org/onap/aai/audit/ListEndpoints.java +++ b/aai-core/src/main/java/org/onap/aai/audit/ListEndpoints.java @@ -19,8 +19,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.audit; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.common.base.CaseFormat; + import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -38,13 +43,9 @@ import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; import org.onap.aai.introspection.LoaderFactory; import org.onap.aai.introspection.ModelType; -import org.onap.aai.setup.SchemaVersion; import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; import org.onap.aai.logging.LogFormatTools; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.common.base.CaseFormat; +import org.onap.aai.setup.SchemaVersion; import org.onap.aai.setup.SchemaVersions; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -53,270 +54,264 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext */ public class ListEndpoints { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ListEndpoints.class); - - private final String start = "inventory"; - private final String[] blacklist = { "search", "aai-internal" }; - - private List endpoints = new ArrayList<>(); - private Map endpointToLogicalName = new HashMap(); - - /** - * The main method. - * - * @param args the arguments - */ - public static void main(String[] args) { - - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( - "org.onap.aai.config", - "org.onap.aai.setup" - ); - - String schemaUriBasePath = context.getEnvironment().getProperty("schema.uri.base.path"); - - if(schemaUriBasePath == null){ - String errorMsg = "Unable to find the property schema.uri.base.path," - +" please check if specified in system property or in schema-ingest.properties"; - System.err.println(errorMsg); - LOGGER.error(errorMsg); - } - - SchemaVersions schemaVersions = context.getBean(SchemaVersions.class); - ListEndpoints endPoints = new ListEndpoints(schemaUriBasePath, schemaVersions.getDefaultVersion()); - - LOGGER.info(endPoints.toString("relationship-list")); - } - - /** - * Instantiates a new list endpoints. - * - * @param version the version - */ - public ListEndpoints(String basePath, SchemaVersion version) { - - Loader loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, version); - - try { - final Introspector start = loader.introspectorFromName(this.start); - Set startMap = new HashSet<>(); - beginAudit(start, basePath + "/" + version, startMap); - } catch (AAIUnknownObjectException e) { - throw new RuntimeException("Failed to find object " + this.start + ", cannot run ListEndpoints audit"); - } - } - - /** - * Begin audit. - * - * @param obj the obj - * @param uri the uri - */ - private void beginAudit(Introspector obj, String uri, Set visited) { - - String currentUri = ""; - - if (!obj.getDbName().equals("inventory")) { - currentUri = uri + obj.getGenericURI(); - } else { - currentUri = uri; - } - if (obj.getName().equals("relationship-data") || obj.getName().equals("related-to-property")) { - return; - } - if (!obj.isContainer()) { - endpoints.add(currentUri); - } - - String dbName = obj.getDbName(); - - populateLogicalName(obj, uri, currentUri); - - Set properties = obj.getProperties(); - Set props = new LinkedHashSet<>(properties); - if (obj.isContainer()) { - for (String key : visited) { - if (props.remove(key)) { - try { - endpoints.add(currentUri + obj.getLoader().introspectorFromName(key).getGenericURI()); - } catch (AAIUnknownObjectException e) { - LOGGER.warn("Skipping endpoint for " + key + " (Unknown object) " + LogFormatTools.getStackTop(e)); - } - } - } - } - - outer: for (String propName : props) { - - for (String item : blacklist) { - if (propName.equals(item)) { - continue outer; - } - } - if (obj.isListType(propName)) { - if (obj.isComplexGenericType(propName)) { - try { - final Introspector nestedObj = obj.newIntrospectorInstanceOfNestedProperty(propName); - Set newVisited = new HashSet<>(); - newVisited.addAll(visited); - newVisited.add(nestedObj.getDbName()); - beginAudit( - nestedObj, - currentUri, - newVisited - ); - } catch (AAIUnknownObjectException e) { - LOGGER.warn("Skipping nested endpoint for " + propName + " (Unknown Object) " + LogFormatTools.getStackTop(e)); - } - } - } else if (obj.isComplexType(propName)) { - try { - final Introspector nestedObj = obj.newIntrospectorInstanceOfProperty(propName); - Set newVisited = new HashSet<>(); - newVisited.addAll(visited); - newVisited.add(nestedObj.getDbName()); - beginAudit(nestedObj, - currentUri, - visited - ); - } catch (AAIUnknownObjectException e) { - LOGGER.warn("Skipping nested enpoint for " + propName + " (Unknown Object) "+ LogFormatTools.getStackTop(e)); - } - } - } - - } - - /** - * Populate logical name. - * - * @param obj the obj - * @param uri the uri - * @param currentUri the current uri - */ - private void populateLogicalName(Introspector obj, String uri, String currentUri) { - - if (obj.getDbName().equals("inventory") || currentUri.split("/").length <= 4 || currentUri.endsWith("relationship-list")) { - return; - } - - if (uri.endsWith("/relationship-list")) { - uri = uri.substring(0, uri.lastIndexOf("/")); - } - - String logicalName = ""; - String keys = ""; - - - if (!obj.getAllKeys().isEmpty()) { - - Pattern p = Pattern.compile("/\\{[\\w\\d\\-]+\\}/\\{[\\w\\d\\-]+\\}+$"); - Matcher m = p.matcher(currentUri); - - if (m.find()) { - keys = StringUtils.join(obj.getAllKeys(), "-and-"); - } else { - keys = StringUtils.join(obj.getAllKeys(), "-or-"); - } - keys = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, keys); - if (!keys.isEmpty()) { - keys = "With" + keys; - } - } - - logicalName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, obj.getDbName()) + keys; - - if (endpointToLogicalName.containsKey(uri) && uri.endsWith("}")) { - logicalName = logicalName + "From" + endpointToLogicalName.get(uri); - } else if (endpointToLogicalName.containsKey(uri.substring(0, uri.lastIndexOf("/")))) { - logicalName = logicalName + "From" + endpointToLogicalName.get(uri.substring(0, uri.lastIndexOf("/"))); - } - - endpointToLogicalName.put(currentUri, logicalName); - - } - - /** - * Gets the logical names. - * - * @return the logical names - */ - public Map getLogicalNames() { - - return endpointToLogicalName; - - } - - /** - * Gets the endpoints. - * - * @return the endpoints - */ - public List getEndpoints() { - - return this.getEndpoints(""); - - } - - /** - * Gets the endpoints. - * - * @param filterOut the filter out - * @return the endpoints - */ - public List getEndpoints(String filterOut) { - List result = new ArrayList<>(); - Pattern p = null; - Matcher m = null; - if (!filterOut.equals("")) { - p = Pattern.compile(filterOut); - m = null; - } - for (String s : endpoints) { - if (p != null) { - m = p.matcher(s); - if (m.find()) { - continue; - } - } - - result.add(s); - } - - return result; - - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (String s : endpoints) { - sb.append(s + "\n"); - } - return sb.toString(); - - } - - /** - * To string. - * - * @param filterOut the filter out - * @return the string - */ - public String toString(String filterOut) { - StringBuilder sb = new StringBuilder(); - Pattern p = Pattern.compile(filterOut); - Matcher m = null; - for (String s : endpoints) { - m = p.matcher(s); - if (!m.find()) { - sb.append(s + "\n"); - } - } - return sb.toString(); - } + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ListEndpoints.class); + + private final String start = "inventory"; + private final String[] blacklist = {"search", "aai-internal"}; + + private List endpoints = new ArrayList<>(); + private Map endpointToLogicalName = new HashMap(); + + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args) { + + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext("org.onap.aai.config", "org.onap.aai.setup"); + + String schemaUriBasePath = context.getEnvironment().getProperty("schema.uri.base.path"); + + if (schemaUriBasePath == null) { + String errorMsg = "Unable to find the property schema.uri.base.path," + + " please check if specified in system property or in schema-ingest.properties"; + System.err.println(errorMsg); + LOGGER.error(errorMsg); + } + + SchemaVersions schemaVersions = context.getBean(SchemaVersions.class); + ListEndpoints endPoints = new ListEndpoints(schemaUriBasePath, schemaVersions.getDefaultVersion()); + + LOGGER.info(endPoints.toString("relationship-list")); + } + + /** + * Instantiates a new list endpoints. + * + * @param version the version + */ + public ListEndpoints(String basePath, SchemaVersion version) { + + Loader loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, version); + + try { + final Introspector start = loader.introspectorFromName(this.start); + Set startMap = new HashSet<>(); + beginAudit(start, basePath + "/" + version, startMap); + } catch (AAIUnknownObjectException e) { + throw new RuntimeException("Failed to find object " + this.start + ", cannot run ListEndpoints audit"); + } + } + + /** + * Begin audit. + * + * @param obj the obj + * @param uri the uri + */ + private void beginAudit(Introspector obj, String uri, Set visited) { + + String currentUri = ""; + + if (!obj.getDbName().equals("inventory")) { + currentUri = uri + obj.getGenericURI(); + } else { + currentUri = uri; + } + if (obj.getName().equals("relationship-data") || obj.getName().equals("related-to-property")) { + return; + } + if (!obj.isContainer()) { + endpoints.add(currentUri); + } + + String dbName = obj.getDbName(); + + populateLogicalName(obj, uri, currentUri); + + Set properties = obj.getProperties(); + Set props = new LinkedHashSet<>(properties); + if (obj.isContainer()) { + for (String key : visited) { + if (props.remove(key)) { + try { + endpoints.add(currentUri + obj.getLoader().introspectorFromName(key).getGenericURI()); + } catch (AAIUnknownObjectException e) { + LOGGER.warn( + "Skipping endpoint for " + key + " (Unknown object) " + LogFormatTools.getStackTop(e)); + } + } + } + } + + outer: for (String propName : props) { + + for (String item : blacklist) { + if (propName.equals(item)) { + continue outer; + } + } + if (obj.isListType(propName)) { + if (obj.isComplexGenericType(propName)) { + try { + final Introspector nestedObj = obj.newIntrospectorInstanceOfNestedProperty(propName); + Set newVisited = new HashSet<>(); + newVisited.addAll(visited); + newVisited.add(nestedObj.getDbName()); + beginAudit(nestedObj, currentUri, newVisited); + } catch (AAIUnknownObjectException e) { + LOGGER.warn("Skipping nested endpoint for " + propName + " (Unknown Object) " + + LogFormatTools.getStackTop(e)); + } + } + } else if (obj.isComplexType(propName)) { + try { + final Introspector nestedObj = obj.newIntrospectorInstanceOfProperty(propName); + Set newVisited = new HashSet<>(); + newVisited.addAll(visited); + newVisited.add(nestedObj.getDbName()); + beginAudit(nestedObj, currentUri, visited); + } catch (AAIUnknownObjectException e) { + LOGGER.warn("Skipping nested enpoint for " + propName + " (Unknown Object) " + + LogFormatTools.getStackTop(e)); + } + } + } + + } + + /** + * Populate logical name. + * + * @param obj the obj + * @param uri the uri + * @param currentUri the current uri + */ + private void populateLogicalName(Introspector obj, String uri, String currentUri) { + + if (obj.getDbName().equals("inventory") || currentUri.split("/").length <= 4 + || currentUri.endsWith("relationship-list")) { + return; + } + + if (uri.endsWith("/relationship-list")) { + uri = uri.substring(0, uri.lastIndexOf("/")); + } + + String logicalName = ""; + String keys = ""; + + if (!obj.getAllKeys().isEmpty()) { + + Pattern p = Pattern.compile("/\\{[\\w\\d\\-]+\\}/\\{[\\w\\d\\-]+\\}+$"); + Matcher m = p.matcher(currentUri); + + if (m.find()) { + keys = StringUtils.join(obj.getAllKeys(), "-and-"); + } else { + keys = StringUtils.join(obj.getAllKeys(), "-or-"); + } + keys = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, keys); + if (!keys.isEmpty()) { + keys = "With" + keys; + } + } + + logicalName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, obj.getDbName()) + keys; + + if (endpointToLogicalName.containsKey(uri) && uri.endsWith("}")) { + logicalName = logicalName + "From" + endpointToLogicalName.get(uri); + } else if (endpointToLogicalName.containsKey(uri.substring(0, uri.lastIndexOf("/")))) { + logicalName = logicalName + "From" + endpointToLogicalName.get(uri.substring(0, uri.lastIndexOf("/"))); + } + + endpointToLogicalName.put(currentUri, logicalName); + + } + + /** + * Gets the logical names. + * + * @return the logical names + */ + public Map getLogicalNames() { + + return endpointToLogicalName; + + } + + /** + * Gets the endpoints. + * + * @return the endpoints + */ + public List getEndpoints() { + + return this.getEndpoints(""); + + } + + /** + * Gets the endpoints. + * + * @param filterOut the filter out + * @return the endpoints + */ + public List getEndpoints(String filterOut) { + List result = new ArrayList<>(); + Pattern p = null; + Matcher m = null; + if (!filterOut.equals("")) { + p = Pattern.compile(filterOut); + m = null; + } + for (String s : endpoints) { + if (p != null) { + m = p.matcher(s); + if (m.find()) { + continue; + } + } + + result.add(s); + } + + return result; + + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (String s : endpoints) { + sb.append(s + "\n"); + } + return sb.toString(); + + } + + /** + * To string. + * + * @param filterOut the filter out + * @return the string + */ + public String toString(String filterOut) { + StringBuilder sb = new StringBuilder(); + Pattern p = Pattern.compile(filterOut); + Matcher m = null; + for (String s : endpoints) { + m = p.matcher(s); + if (!m.find()) { + sb.append(s + "\n"); + } + } + return sb.toString(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/auth/AAIAuthCore.java b/aai-core/src/main/java/org/onap/aai/auth/AAIAuthCore.java index 6673c08a..cde2faa3 100644 --- a/aai-core/src/main/java/org/onap/aai/auth/AAIAuthCore.java +++ b/aai-core/src/main/java/org/onap/aai/auth/AAIAuthCore.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.auth; import com.att.eelf.configuration.EELFLogger; @@ -26,15 +27,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.eclipse.jetty.util.security.Password; -import org.eclipse.persistence.internal.oxm.conversion.Base64; -import org.onap.aai.auth.exceptions.AAIUnrecognizedFunctionException; -import org.onap.aai.logging.ErrorLogHelper; -import org.onap.aai.logging.LoggingContext; -import org.onap.aai.logging.LoggingContext.StatusCode; -import org.onap.aai.util.AAIConfig; -import org.onap.aai.util.AAIConstants; -import org.onap.aai.util.FileWatcher; import java.io.File; import java.io.FileNotFoundException; @@ -46,311 +38,335 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.eclipse.jetty.util.security.Password; +import org.eclipse.persistence.internal.oxm.conversion.Base64; +import org.onap.aai.auth.exceptions.AAIUnrecognizedFunctionException; +import org.onap.aai.logging.ErrorLogHelper; +import org.onap.aai.logging.LoggingContext; +import org.onap.aai.logging.LoggingContext.StatusCode; +import org.onap.aai.util.AAIConfig; +import org.onap.aai.util.AAIConstants; +import org.onap.aai.util.FileWatcher; + /** * The Class AAIAuthCore. */ public final class AAIAuthCore { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIAuthCore.class); - - private static final String ERROR_CODE_AAI_4001 = "AAI_4001"; - - private String globalAuthFileName = AAIConstants.AAI_AUTH_CONFIG_FILENAME; - - private final Pattern AUTH_POLICY_PATTERN; - private final Set validFunctions = new HashSet<>(); - private Map users; - private boolean timerSet = false; - private Timer timer = null; - - private String basePath; - /** - * Instantiates a new AAI auth core. - */ - public AAIAuthCore(String basePath) { - this.basePath = basePath; - AUTH_POLICY_PATTERN = Pattern.compile("^" + this.basePath +"/v\\d+/([\\w\\-]*)"); - init(); - } - - /** - * Inits the. - */ - private synchronized void init() { - - LOGGER.debug("Initializing Auth Policy Config"); - - reloadUsers(); - - /* - * this timer code is setting up a recurring task that checks if the - * auth config file has been updated and reloads the users if so to get - * the most up to date info (that update check logic is within - * FileWatcher) - * - * the timing this method uses is coarser than the frequency of requests - * AI&I gets so we're looking at better ways of doing this (TODO) - */ - TimerTask task = new FileWatcher(new File(globalAuthFileName)) { - @Override - protected void onChange(File file) { - reloadUsers(); - } - }; - - if (!timerSet) { - timerSet = true; - timer = new Timer(); - - // repeat the check every second - timer.schedule(task, new Date(), 10000); - } - LOGGER.debug("Static Initializiation complete"); - } - - /** - * Cleanup. - */ - // just ends the auth config file update checking timer - public void cleanup() { - timer.cancel(); - } - - /** - * Reload users. - */ - /* - * this essentially takes the data file, which is organized role-first with - * users under each role and converts it to data organized user-first with - * each user containing their role with its associated allowed functions - * this data stored in the class field users - */ - private synchronized void reloadUsers() { - - Map tempUsers = new HashMap<>(); - - try { - LOGGER.debug("Reading from " + globalAuthFileName); - String authFile = new String(Files.readAllBytes(Paths.get(globalAuthFileName))); - - JsonParser parser = new JsonParser(); - JsonObject authObject = parser.parse(authFile).getAsJsonObject(); - if (authObject.has("roles")) { - JsonArray roles = authObject.getAsJsonArray("roles"); - for (JsonElement role : roles) { - if (role.isJsonObject()) { - JsonObject roleObject = role.getAsJsonObject(); - String roleName = roleObject.get("name").getAsString(); - Map usrs = this.getUsernamesFromRole(roleObject); - List aaiFunctions = this.getAAIFunctions(roleObject); - - usrs.forEach((key, value) -> { - final AAIUser au = tempUsers.getOrDefault(key, new AAIUser(key, value)); - au.addRole(roleName); - aaiFunctions.forEach(f -> { - List httpMethods = this.getRoleHttpMethods(f, roleObject); - httpMethods.forEach(hm -> au.setUserAccess(f, hm)); - this.validFunctions.add(f); - }); - - tempUsers.put(key, au); - - }); - } - } - if (!tempUsers.isEmpty()) { - users = tempUsers; - } - } - } catch (FileNotFoundException e) { - ErrorLogHelper.logError(ERROR_CODE_AAI_4001, globalAuthFileName + ". Exception: " + e); - } catch (JsonProcessingException e) { - ErrorLogHelper.logError(ERROR_CODE_AAI_4001, globalAuthFileName + ". Not valid JSON: " + e); - } catch (Exception e) { - ErrorLogHelper.logError(ERROR_CODE_AAI_4001, globalAuthFileName + ". Exception caught: " + e); - } - } - - private List getRoleHttpMethods(String aaiFunctionName, JsonObject roleObject) { - List httpMethods = new ArrayList<>(); - - JsonArray ja = roleObject.getAsJsonArray("functions"); - for (JsonElement je : ja) { - if (je.isJsonObject() && je.getAsJsonObject().has("name") && je.getAsJsonObject().get("name").getAsString().equals(aaiFunctionName)) { - JsonArray jaMeth = je.getAsJsonObject().getAsJsonArray("methods"); - for (JsonElement jeMeth : jaMeth) { - if (jeMeth.isJsonObject() && jeMeth.getAsJsonObject().has("name")) { - httpMethods.add(jeMeth.getAsJsonObject().get("name").getAsString()); - } - } - } - } - - return httpMethods; - } - - private List getAAIFunctions(JsonObject roleObject) { - List aaiFunctions = new ArrayList<>(); - - JsonArray ja = roleObject.getAsJsonArray("functions"); - for (JsonElement je : ja) { - if (je.isJsonObject() && je.getAsJsonObject().has("name")) { - aaiFunctions.add(je.getAsJsonObject().get("name").getAsString()); - } - } - - return aaiFunctions; - } - - private Map getUsernamesFromRole(JsonObject roleObject) throws UnsupportedEncodingException { - Map usernames = new HashMap<>(); - - JsonArray uja = roleObject.getAsJsonArray("users"); - for (JsonElement je : uja) { - if (je.isJsonObject()) { - if (je.getAsJsonObject().has("username")) { - if (je.getAsJsonObject().has("is-wildcard-id")) { - usernames.put(je.getAsJsonObject().get("username").getAsString().toLowerCase(), je.getAsJsonObject().get("is-wildcard-id").getAsBoolean()); - } else { - usernames.put(je.getAsJsonObject().get("username").getAsString().toLowerCase(), false); - } - } else if (je.getAsJsonObject().has("user")) { - String auth = je.getAsJsonObject().get("user").getAsString() + ":" + Password.deobfuscate(je.getAsJsonObject().get("pass").getAsString()); - String authorizationCode = new String(Base64.base64Encode(auth.getBytes("utf-8"))); - usernames.put(authorizationCode, false); - } - } - } - - return usernames; - } - - public String getAuthPolicyFunctName(String uri) { - String authPolicyFunctionName = ""; - if (uri.startsWith(basePath + "/search")) { - authPolicyFunctionName = "search"; + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIAuthCore.class); + + private static final String ERROR_CODE_AAI_4001 = "AAI_4001"; + + private String globalAuthFileName = AAIConstants.AAI_AUTH_CONFIG_FILENAME; + + private final Pattern AUTH_POLICY_PATTERN; + private final Set validFunctions = new HashSet<>(); + private Map users; + private boolean timerSet = false; + private Timer timer = null; + + private String basePath; + + /** + * Instantiates a new AAI auth core. + */ + public AAIAuthCore(String basePath) { + this.basePath = basePath; + AUTH_POLICY_PATTERN = Pattern.compile("^" + this.basePath + "/v\\d+/([\\w\\-]*)"); + init(); + } + + /** + * Inits the. + */ + private synchronized void init() { + + LOGGER.debug("Initializing Auth Policy Config"); + + reloadUsers(); + + /* + * this timer code is setting up a recurring task that checks if the + * auth config file has been updated and reloads the users if so to get + * the most up to date info (that update check logic is within + * FileWatcher) + * + * the timing this method uses is coarser than the frequency of requests + * AI&I gets so we're looking at better ways of doing this (TODO) + */ + TimerTask task = new FileWatcher(new File(globalAuthFileName)) { + @Override + protected void onChange(File file) { + reloadUsers(); + } + }; + + if (!timerSet) { + timerSet = true; + timer = new Timer(); + + // repeat the check every second + timer.schedule(task, new Date(), 10000); + } + LOGGER.debug("Static Initializiation complete"); + } + + /** + * Cleanup. + */ + // just ends the auth config file update checking timer + public void cleanup() { + timer.cancel(); + } + + /** + * Reload users. + */ + /* + * this essentially takes the data file, which is organized role-first with + * users under each role and converts it to data organized user-first with + * each user containing their role with its associated allowed functions + * this data stored in the class field users + */ + private synchronized void reloadUsers() { + + Map tempUsers = new HashMap<>(); + + try { + LOGGER.debug("Reading from " + globalAuthFileName); + String authFile = new String(Files.readAllBytes(Paths.get(globalAuthFileName))); + + JsonParser parser = new JsonParser(); + JsonObject authObject = parser.parse(authFile).getAsJsonObject(); + if (authObject.has("roles")) { + JsonArray roles = authObject.getAsJsonArray("roles"); + for (JsonElement role : roles) { + if (role.isJsonObject()) { + JsonObject roleObject = role.getAsJsonObject(); + String roleName = roleObject.get("name").getAsString(); + Map usrs = this.getUsernamesFromRole(roleObject); + List aaiFunctions = this.getAAIFunctions(roleObject); + + usrs.forEach((key, value) -> { + final AAIUser au = tempUsers.getOrDefault(key, new AAIUser(key, value)); + au.addRole(roleName); + aaiFunctions.forEach(f -> { + List httpMethods = this.getRoleHttpMethods(f, roleObject); + httpMethods.forEach(hm -> au.setUserAccess(f, hm)); + this.validFunctions.add(f); + }); + + tempUsers.put(key, au); + + }); + } + } + if (!tempUsers.isEmpty()) { + users = tempUsers; + } + } + } catch (FileNotFoundException e) { + ErrorLogHelper.logError(ERROR_CODE_AAI_4001, globalAuthFileName + ". Exception: " + e); + } catch (JsonProcessingException e) { + ErrorLogHelper.logError(ERROR_CODE_AAI_4001, globalAuthFileName + ". Not valid JSON: " + e); + } catch (Exception e) { + ErrorLogHelper.logError(ERROR_CODE_AAI_4001, globalAuthFileName + ". Exception caught: " + e); + } + } + + private List getRoleHttpMethods(String aaiFunctionName, JsonObject roleObject) { + List httpMethods = new ArrayList<>(); + + JsonArray ja = roleObject.getAsJsonArray("functions"); + for (JsonElement je : ja) { + if (je.isJsonObject() && je.getAsJsonObject().has("name") + && je.getAsJsonObject().get("name").getAsString().equals(aaiFunctionName)) { + JsonArray jaMeth = je.getAsJsonObject().getAsJsonArray("methods"); + for (JsonElement jeMeth : jaMeth) { + if (jeMeth.isJsonObject() && jeMeth.getAsJsonObject().has("name")) { + httpMethods.add(jeMeth.getAsJsonObject().get("name").getAsString()); + } + } + } + } + + return httpMethods; + } + + private List getAAIFunctions(JsonObject roleObject) { + List aaiFunctions = new ArrayList<>(); + + JsonArray ja = roleObject.getAsJsonArray("functions"); + for (JsonElement je : ja) { + if (je.isJsonObject() && je.getAsJsonObject().has("name")) { + aaiFunctions.add(je.getAsJsonObject().get("name").getAsString()); + } + } + + return aaiFunctions; + } + + private Map getUsernamesFromRole(JsonObject roleObject) throws UnsupportedEncodingException { + Map usernames = new HashMap<>(); + + JsonArray uja = roleObject.getAsJsonArray("users"); + for (JsonElement je : uja) { + if (je.isJsonObject()) { + if (je.getAsJsonObject().has("username")) { + if (je.getAsJsonObject().has("is-wildcard-id")) { + usernames.put(je.getAsJsonObject().get("username").getAsString().toLowerCase(), + je.getAsJsonObject().get("is-wildcard-id").getAsBoolean()); + } else { + usernames.put(je.getAsJsonObject().get("username").getAsString().toLowerCase(), false); + } + } else if (je.getAsJsonObject().has("user")) { + String auth = je.getAsJsonObject().get("user").getAsString() + ":" + + Password.deobfuscate(je.getAsJsonObject().get("pass").getAsString()); + String authorizationCode = new String(Base64.base64Encode(auth.getBytes("utf-8"))); + usernames.put(authorizationCode, false); + } + } + } + + return usernames; + } + + public String getAuthPolicyFunctName(String uri) { + String authPolicyFunctionName = ""; + if (uri.startsWith(basePath + "/search")) { + authPolicyFunctionName = "search"; } else if (uri.startsWith(basePath + "/recents")) { authPolicyFunctionName = "recents"; - }else if (uri.startsWith(basePath + "/cq2gremlin")) { + } else if (uri.startsWith(basePath + "/cq2gremlin")) { authPolicyFunctionName = "cq2gremlin"; - }else if (uri.startsWith(basePath + "/cq2gremlintest")) { + } else if (uri.startsWith(basePath + "/cq2gremlintest")) { authPolicyFunctionName = "cq2gremlintest"; - }else if (uri.startsWith(basePath + "/util/echo")) { - authPolicyFunctionName = "util"; - } else if (uri.startsWith(basePath + "/tools")) { - authPolicyFunctionName = "tools"; - } else { - Matcher match = AUTH_POLICY_PATTERN.matcher(uri); - if (match.find()) { - authPolicyFunctionName = match.group(1); - } - } - return authPolicyFunctionName; - } - - /** - * for backwards compatibility - * @param username - * @param uri - * @param httpMethod - * @param haProxyUser - * @return - * @throws AAIUnrecognizedFunctionException - */ - public boolean authorize(String username, String uri, String httpMethod, String haProxyUser) throws AAIUnrecognizedFunctionException { - return authorize(username, uri, httpMethod, haProxyUser, null); - } - - /** - * - * @param username - * @param uri - * @param httpMethod - * @param haProxyUser - * @param issuer issuer of the cert - * @return - * @throws AAIUnrecognizedFunctionException - */ - public boolean authorize(String username, String uri, String httpMethod, String haProxyUser, String issuer) throws AAIUnrecognizedFunctionException { - String aaiMethod = this.getAuthPolicyFunctName(uri); - if (!this.validFunctions.contains(aaiMethod)) { - throw new AAIUnrecognizedFunctionException(aaiMethod); - } - boolean wildcardCheck = isWildcardIssuer(issuer); - boolean authorized; - LOGGER.debug("Authorizing the user for the request cert {}, haproxy header {}, aai method {}, httpMethod {}, cert issuer {}", - username, haProxyUser, aaiMethod, httpMethod, issuer); - Optional oau = this.getUser(username, wildcardCheck); - if (oau.isPresent()) { - AAIUser au = oau.get(); - if (au.hasRole("HAProxy")) { - LOGGER.debug("User has HAProxy role"); - if ("GET".equalsIgnoreCase(httpMethod) && "util".equalsIgnoreCase(aaiMethod) && haProxyUser.isEmpty()) { - LOGGER.debug("Authorized user has HAProxy role with echo request"); - authorized = this.authorize(au, aaiMethod, httpMethod); - } else { - authorized = this.authorize(haProxyUser, uri, httpMethod, "", issuer); - } - } else { - LOGGER.debug("User doesn't have HAProxy role so assuming its a regular client"); - authorized = this.authorize(au, aaiMethod, httpMethod); - } - } else { - LOGGER.debug("User not found: " + username + " on function " + aaiMethod + " request type " + httpMethod); - authorized = false; - } - - return authorized; - } - - private boolean isWildcardIssuer(String issuer) { - if (issuer != null && !issuer.isEmpty()) { - List validIssuers = Arrays.asList(AAIConfig.get("aaf.valid.issuer.wildcard", UUID.randomUUID().toString()).split("\\|")); - for (String validIssuer : validIssuers) { - if (issuer.contains(validIssuer)) { - return true; - } - } - } - return false; - } - - /** - * returns aai user either matching the username or containing the wildcard. - * @param username - * @return - */ - public Optional getUser(String username, boolean wildcardCheck) { - if (users.containsKey(username)) { - return Optional.of(users.get(username)); - } else if (wildcardCheck){ - List laus = users.entrySet().stream().filter(e -> e.getValue().isWildcard() && username.contains(e.getKey())).map(Map.Entry::getValue).collect(Collectors.toList()); - if (!laus.isEmpty()) { - return Optional.of(laus.get(0)); - } - } - return Optional.empty(); - } - - /** - * - * @param aaiUser - * aai user with the username - * @param aaiMethod - * aai function the authorization is required on - * @param httpMethod - * http action user is attempting - * @return true, if successful - */ - private boolean authorize(AAIUser aaiUser, String aaiMethod, String httpMethod) { - if (aaiUser.hasAccess(aaiMethod, httpMethod)) { - LoggingContext.statusCode(StatusCode.COMPLETE); - LOGGER.debug("AUTH ACCEPTED: " + aaiUser.getUsername() + " on function " + aaiMethod + " request type " + httpMethod); - return true; - } else { - LoggingContext.statusCode(StatusCode.ERROR); - LOGGER.debug("AUTH FAILED: " + aaiUser.getUsername() + " on function " + aaiMethod + " request type " + httpMethod); - return false; - } - } + } else if (uri.startsWith(basePath + "/util/echo")) { + authPolicyFunctionName = "util"; + } else if (uri.startsWith(basePath + "/tools")) { + authPolicyFunctionName = "tools"; + } else { + Matcher match = AUTH_POLICY_PATTERN.matcher(uri); + if (match.find()) { + authPolicyFunctionName = match.group(1); + } + } + return authPolicyFunctionName; + } + + /** + * for backwards compatibility + * + * @param username + * @param uri + * @param httpMethod + * @param haProxyUser + * @return + * @throws AAIUnrecognizedFunctionException + */ + public boolean authorize(String username, String uri, String httpMethod, String haProxyUser) + throws AAIUnrecognizedFunctionException { + return authorize(username, uri, httpMethod, haProxyUser, null); + } + + /** + * + * @param username + * @param uri + * @param httpMethod + * @param haProxyUser + * @param issuer issuer of the cert + * @return + * @throws AAIUnrecognizedFunctionException + */ + public boolean authorize(String username, String uri, String httpMethod, String haProxyUser, String issuer) + throws AAIUnrecognizedFunctionException { + String aaiMethod = this.getAuthPolicyFunctName(uri); + if (!this.validFunctions.contains(aaiMethod)) { + throw new AAIUnrecognizedFunctionException(aaiMethod); + } + boolean wildcardCheck = isWildcardIssuer(issuer); + boolean authorized; + LOGGER.debug( + "Authorizing the user for the request cert {}, haproxy header {}, aai method {}, httpMethod {}, cert issuer {}", + username, haProxyUser, aaiMethod, httpMethod, issuer); + Optional oau = this.getUser(username, wildcardCheck); + if (oau.isPresent()) { + AAIUser au = oau.get(); + if (au.hasRole("HAProxy")) { + LOGGER.debug("User has HAProxy role"); + if ("GET".equalsIgnoreCase(httpMethod) && "util".equalsIgnoreCase(aaiMethod) && haProxyUser.isEmpty()) { + LOGGER.debug("Authorized user has HAProxy role with echo request"); + authorized = this.authorize(au, aaiMethod, httpMethod); + } else { + authorized = this.authorize(haProxyUser, uri, httpMethod, "", issuer); + } + } else { + LOGGER.debug("User doesn't have HAProxy role so assuming its a regular client"); + authorized = this.authorize(au, aaiMethod, httpMethod); + } + } else { + LOGGER.debug("User not found: " + username + " on function " + aaiMethod + " request type " + httpMethod); + authorized = false; + } + + return authorized; + } + + private boolean isWildcardIssuer(String issuer) { + if (issuer != null && !issuer.isEmpty()) { + List validIssuers = Arrays + .asList(AAIConfig.get("aaf.valid.issuer.wildcard", UUID.randomUUID().toString()).split("\\|")); + for (String validIssuer : validIssuers) { + if (issuer.contains(validIssuer)) { + return true; + } + } + } + return false; + } + + /** + * returns aai user either matching the username or containing the wildcard. + * + * @param username + * @return + */ + public Optional getUser(String username, boolean wildcardCheck) { + if (users.containsKey(username)) { + return Optional.of(users.get(username)); + } else if (wildcardCheck) { + List laus = + users.entrySet().stream().filter(e -> e.getValue().isWildcard() && username.contains(e.getKey())) + .map(Map.Entry::getValue).collect(Collectors.toList()); + if (!laus.isEmpty()) { + return Optional.of(laus.get(0)); + } + } + return Optional.empty(); + } + + /** + * + * @param aaiUser + * aai user with the username + * @param aaiMethod + * aai function the authorization is required on + * @param httpMethod + * http action user is attempting + * @return true, if successful + */ + private boolean authorize(AAIUser aaiUser, String aaiMethod, String httpMethod) { + if (aaiUser.hasAccess(aaiMethod, httpMethod)) { + LoggingContext.statusCode(StatusCode.COMPLETE); + LOGGER.debug("AUTH ACCEPTED: " + aaiUser.getUsername() + " on function " + aaiMethod + " request type " + + httpMethod); + return true; + } else { + LoggingContext.statusCode(StatusCode.ERROR); + LOGGER.debug("AUTH FAILED: " + aaiUser.getUsername() + " on function " + aaiMethod + " request type " + + httpMethod); + return false; + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/auth/AAIUser.java b/aai-core/src/main/java/org/onap/aai/auth/AAIUser.java index 499c6858..f1e1b084 100644 --- a/aai-core/src/main/java/org/onap/aai/auth/AAIUser.java +++ b/aai-core/src/main/java/org/onap/aai/auth/AAIUser.java @@ -19,6 +19,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.auth; import java.util.*; diff --git a/aai-core/src/main/java/org/onap/aai/auth/exceptions/AAIUnrecognizedFunctionException.java b/aai-core/src/main/java/org/onap/aai/auth/exceptions/AAIUnrecognizedFunctionException.java index 01be1c27..1410b445 100644 --- a/aai-core/src/main/java/org/onap/aai/auth/exceptions/AAIUnrecognizedFunctionException.java +++ b/aai-core/src/main/java/org/onap/aai/auth/exceptions/AAIUnrecognizedFunctionException.java @@ -19,6 +19,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.auth.exceptions; import org.onap.aai.exceptions.AAIException; @@ -28,14 +29,15 @@ public class AAIUnrecognizedFunctionException extends AAIException { private static final String AAI_3012 = "AAI_3012"; private static final long serialVersionUID = 3297064867724071290L; - public AAIUnrecognizedFunctionException() {} + public AAIUnrecognizedFunctionException() { + } public AAIUnrecognizedFunctionException(String message) { super(AAI_3012, message); } public AAIUnrecognizedFunctionException(Throwable cause) { - super(AAI_3012,cause); + super(AAI_3012, cause); } public AAIUnrecognizedFunctionException(String message, Throwable cause) { diff --git a/aai-core/src/main/java/org/onap/aai/concurrent/AaiCallable.java b/aai-core/src/main/java/org/onap/aai/concurrent/AaiCallable.java index 0f3469e9..6ea67b90 100644 --- a/aai-core/src/main/java/org/onap/aai/concurrent/AaiCallable.java +++ b/aai-core/src/main/java/org/onap/aai/concurrent/AaiCallable.java @@ -17,32 +17,39 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.concurrent; -import java.util.concurrent.Callable; + import java.util.Map; +import java.util.concurrent.Callable; + import org.slf4j.MDC; /** - * The Class AaiCallable ensures that the Callable gets a copy of the MDC, so that any logging related fields are preserved + * The Class AaiCallable ensures that the Callable gets a copy of the MDC, so that any logging related fields are + * preserved */ public abstract class AaiCallable implements Callable { - private Map mdcCopy; - /** - * The constructor. - */ - @SuppressWarnings("unchecked") - public AaiCallable() { + private Map mdcCopy; + + /** + * The constructor. + */ + @SuppressWarnings("unchecked") + public AaiCallable() { mdcCopy = MDC.getCopyOfContextMap(); } - /** - * The call method - */ + + /** + * The call method + */ public T call() throws Exception { - MDC.setContextMap(mdcCopy); + MDC.setContextMap(mdcCopy); return process(); } + /** - * The process method - */ + * The process method + */ public abstract T process() throws Exception; } diff --git a/aai-core/src/main/java/org/onap/aai/config/AuthorizationConfiguration.java b/aai-core/src/main/java/org/onap/aai/config/AuthorizationConfiguration.java index 0efe1475..9f8bbc45 100644 --- a/aai-core/src/main/java/org/onap/aai/config/AuthorizationConfiguration.java +++ b/aai-core/src/main/java/org/onap/aai/config/AuthorizationConfiguration.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.config; import org.onap.aai.auth.AAIAuthCore; @@ -33,7 +34,7 @@ public class AuthorizationConfiguration { private String basePath; @Bean - public AAIAuthCore aaiAuthCore(){ + public AAIAuthCore aaiAuthCore() { return new AAIAuthCore(basePath); } } diff --git a/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java b/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java index 750bc24f..2a4673c0 100644 --- a/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java +++ b/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java @@ -19,27 +19,29 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.config; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +package org.onap.aai.config; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import org.onap.aai.introspection.LoaderFactory; import org.onap.aai.introspection.MoxyLoader; +import org.onap.aai.setup.SchemaVersion; +import org.onap.aai.setup.SchemaVersions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -@Import({ConfigConfiguration.class, SchemaServiceConfiguration.class, NodesConfiguration.class, EdgesConfiguration.class}) + +@Import({ConfigConfiguration.class, SchemaServiceConfiguration.class, NodesConfiguration.class, + EdgesConfiguration.class}) @Configuration public class IntrospectionConfig { private Map moxyInstanceMap = new ConcurrentHashMap<>(); - + @Autowired NodesConfiguration nodesConfiguration; @@ -50,7 +52,7 @@ public class IntrospectionConfig { @Bean public Map moxyLoaderInstance(SchemaVersions schemaVersions) { - for(SchemaVersion version : schemaVersions.getVersions()){ + for (SchemaVersion version : schemaVersions.getVersions()) { if (!moxyInstanceMap.containsKey(version)) { moxyInstanceMap.put(version, new MoxyLoader(version, nodesConfiguration.nodeIngestor())); } diff --git a/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java b/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java index 6c56ff69..4dc8860e 100644 --- a/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java +++ b/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java @@ -19,11 +19,10 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.config; +package org.onap.aai.config; import org.onap.aai.introspection.ModelType; - import org.onap.aai.rest.db.HttpEntry; import org.onap.aai.serialization.engines.QueryStyle; import org.springframework.beans.factory.config.ConfigurableBeanFactory; @@ -38,13 +37,11 @@ public class RestBeanConfig { public HttpEntry traversalUriHttpEntry() { return new HttpEntry(ModelType.MOXY, QueryStyle.TRAVERSAL_URI); } - + @Bean(name = "traversalHttpEntry") @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public HttpEntry traversalHttpEntry() { return new HttpEntry(ModelType.MOXY, QueryStyle.TRAVERSAL); } - - - + } diff --git a/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java b/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java index c11d7a56..885790ce 100644 --- a/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java +++ b/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java @@ -19,15 +19,16 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.config; import org.onap.aai.edges.EdgeIngestor; import org.onap.aai.nodes.NodeIngestor; +import org.onap.aai.serialization.db.EdgeSerializer; import org.onap.aai.setup.AAIConfigTranslator; import org.onap.aai.setup.ConfigTranslator; -import org.onap.aai.setup.SchemaLocationsBean; import org.onap.aai.setup.SchemaConfigVersions; -import org.onap.aai.serialization.db.EdgeSerializer; +import org.onap.aai.setup.SchemaLocationsBean; import org.onap.aai.validation.CheckEverythingStrategy; import org.onap.aai.validation.SchemaErrorStrategy; import org.onap.aai.validation.nodes.DefaultDuplicateNodeDefinitionValidationModule; @@ -36,13 +37,14 @@ import org.onap.aai.validation.nodes.NodeValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.*; + @Import({NodesConfiguration.class, EdgesConfiguration.class}) @Configuration @PropertySource(value = "classpath:schema-ingest.properties", ignoreResourceNotFound = true) @PropertySource(value = "file:${schema.ingest.file}", ignoreResourceNotFound = true) public class SchemaConfiguration { - //TODO : Inject this directly into nodeIngestor + // TODO : Inject this directly into nodeIngestor @Autowired(required = false) NodesConfiguration nodesConfiguration; @@ -50,12 +52,12 @@ public class SchemaConfiguration { EdgesConfiguration edgesConfiguration; @Bean - public EdgeIngestor edgeIngestor(){ + public EdgeIngestor edgeIngestor() { return edgesConfiguration.edgeIngestor(); } @Bean - public EdgeSerializer edgeSerializer(EdgeIngestor edgeIngestor){ + public EdgeSerializer edgeSerializer(EdgeIngestor edgeIngestor) { return new EdgeSerializer(edgeIngestor); } @@ -64,32 +66,29 @@ public class SchemaConfiguration { return nodesConfiguration.nodeIngestor(); } - @Bean(name = "configTranslator") @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) - public ConfigTranslator configTranslator(SchemaLocationsBean schemaLocationsBean, SchemaConfigVersions schemaVersions) { + public ConfigTranslator configTranslator(SchemaLocationsBean schemaLocationsBean, + SchemaConfigVersions schemaVersions) { return new AAIConfigTranslator(schemaLocationsBean, schemaVersions); } @Bean @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) - public SchemaErrorStrategy schemaErrorStrategy(){ + public SchemaErrorStrategy schemaErrorStrategy() { return new CheckEverythingStrategy(); - } + } - @Bean - @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) - public DuplicateNodeDefinitionValidationModule duplicateNodeDefinitionValidationModule(){ - return new DefaultDuplicateNodeDefinitionValidationModule(); - } + @Bean + @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) + public DuplicateNodeDefinitionValidationModule duplicateNodeDefinitionValidationModule() { + return new DefaultDuplicateNodeDefinitionValidationModule(); + } - @Bean - @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) - public NodeValidator nodeValidator( - ConfigTranslator configTranslator, - SchemaErrorStrategy schemaErrorStrategy, - DuplicateNodeDefinitionValidationModule duplicateNodeDefinitionValidationModule - ){ + @Bean + @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) + public NodeValidator nodeValidator(ConfigTranslator configTranslator, SchemaErrorStrategy schemaErrorStrategy, + DuplicateNodeDefinitionValidationModule duplicateNodeDefinitionValidationModule) { return new NodeValidator(configTranslator, schemaErrorStrategy, duplicateNodeDefinitionValidationModule); - } + } } diff --git a/aai-core/src/main/java/org/onap/aai/config/SpringContextAware.java b/aai-core/src/main/java/org/onap/aai/config/SpringContextAware.java index c58d57e9..b8694554 100644 --- a/aai-core/src/main/java/org/onap/aai/config/SpringContextAware.java +++ b/aai-core/src/main/java/org/onap/aai/config/SpringContextAware.java @@ -17,8 +17,8 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.config; +package org.onap.aai.config; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; @@ -31,31 +31,30 @@ public class SpringContextAware implements ApplicationContextAware { private static ApplicationContext context = null; public static ApplicationContext getApplicationContext() { - return context; + return context; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - context = applicationContext; + context = applicationContext; } - - - public static T getBean(String beanName, Class requiredType) { - if(context != null){ - return context.getBean(beanName, requiredType); - } + + public static T getBean(String beanName, Class requiredType) { + if (context != null) { + return context.getBean(beanName, requiredType); + } return null; - } + } - public static T getBean(Class clazz){ - if(context != null){ + public static T getBean(Class clazz) { + if (context != null) { return context.getBean(clazz); } return null; } - public static Object getBean(String bean){ - if(context != null){ + public static Object getBean(String bean) { + if (context != null) { return context.getBean(bean); } return null; diff --git a/aai-core/src/main/java/org/onap/aai/db/DbMethHelper.java b/aai-core/src/main/java/org/onap/aai/db/DbMethHelper.java index 9a73f0f0..5c955cb5 100644 --- a/aai-core/src/main/java/org/onap/aai/db/DbMethHelper.java +++ b/aai-core/src/main/java/org/onap/aai/db/DbMethHelper.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.db; import java.io.UnsupportedEncodingException; @@ -30,7 +31,6 @@ import java.util.Optional; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; - import org.onap.aai.exceptions.AAIException; import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; @@ -42,116 +42,119 @@ import org.onap.aai.serialization.engines.TransactionalGraphEngine; public class DbMethHelper { - private final Loader loader; - private final TransactionalGraphEngine engine; - - protected DbMethHelper() { - this.loader = null; - this.engine = null; - } - public DbMethHelper(Loader loader, TransactionalGraphEngine engine) { - this.loader = loader; - this.engine = engine; - } - /** - * - * @param type - * @param map - form [{type}.{propname}:{value}] - * @return - * @throws UnsupportedEncodingException - * @throws AAIException - */ - public Optional searchVertexByIdentityMap(String type, Map map) throws AAIException { - - Introspector relationship = constructRelationship(type, map); - RelationshipToURI parser; - URI uri; - QueryParser queryParser; - try { - parser = new RelationshipToURI(loader, relationship); - uri = parser.getUri(); - queryParser = this.engine.getQueryBuilder().createQueryFromURI(uri); - } catch (UnsupportedEncodingException e) { - throw new AAIException("AAI_3000"); - } - - List results = queryParser.getQueryBuilder().toList(); - - return reduceToSingleVertex(results, map); - } - - /** - * @param type - * @param map - form [{propname}:{value}] - * @return - * @throws AAIException - */ - public Optional locateUniqueVertex(String type, Map map) throws AAIException { - - return reduceToSingleVertex(locateUniqueVertices(type, map), map); - } - - public List locateUniqueVertices(String type, Map map) throws AAIException { - Introspector obj = this.createIntrospectorFromMap(type, map); - QueryBuilder builder = this.engine.getQueryBuilder().exactMatchQuery(obj); - - return builder.toList(); - } - private Introspector constructRelationship(String type, Map map) throws AAIUnknownObjectException { - final Introspector relationship = loader.introspectorFromName("relationship"); - relationship.setValue("related-to", type); - final List data = relationship.getValue("relationship-data"); - for (Entry entry : map.entrySet()) { - final Introspector dataObj = loader.introspectorFromName("relationship-data"); - dataObj.setValue("relationship-key", entry.getKey()); - dataObj.setValue("relationship-value", entry.getValue()); - data.add(dataObj.getUnderlyingObject()); - } - - return relationship; - } - - private Introspector createIntrospectorFromMap(String targetNodeType, Map propHash) throws AAIUnknownObjectException { - final Introspector result = loader.introspectorFromName(targetNodeType); - for (Entry entry : propHash.entrySet()) { - result.setValue(entry.getKey(), entry.getValue()); - } - return result; - } - - private Optional reduceToSingleVertex(List vertices, Map map) throws AAIException { - if (vertices.isEmpty()){ - return Optional.empty(); - } else if (vertices.size() > 1) { - throw new AAIException("AAI_6112", "More than one Node found by getUniqueNode for params: " + map); - } - - return Optional.of(vertices.get(0)); - } - public List getVertexProperties(Vertex v) { - List retArr = new ArrayList<>(); - if( v == null ){ - retArr.add("null Node object passed to showPropertiesForNode()\n"); - } - else { - String nodeType; - Object ob = v.property("aai-node-type").orElse(null); - if( ob == null ){ - nodeType = "null"; - } - else{ - nodeType = ob.toString(); - } - - retArr.add(" AAINodeType/VtxID for this Node = [" + nodeType + "/" + v.id() + "]"); - retArr.add(" Property Detail: "); - Iterator> pI = v.properties(); - while( pI.hasNext() ){ - VertexProperty tp = pI.next(); - Object val = tp.value(); - retArr.add("Prop: [" + tp.key() + "], val = [" + val + "] "); - } - } - return retArr; - } + private final Loader loader; + private final TransactionalGraphEngine engine; + + protected DbMethHelper() { + this.loader = null; + this.engine = null; + } + + public DbMethHelper(Loader loader, TransactionalGraphEngine engine) { + this.loader = loader; + this.engine = engine; + } + + /** + * + * @param type + * @param map - form [{type}.{propname}:{value}] + * @return + * @throws UnsupportedEncodingException + * @throws AAIException + */ + public Optional searchVertexByIdentityMap(String type, Map map) throws AAIException { + + Introspector relationship = constructRelationship(type, map); + RelationshipToURI parser; + URI uri; + QueryParser queryParser; + try { + parser = new RelationshipToURI(loader, relationship); + uri = parser.getUri(); + queryParser = this.engine.getQueryBuilder().createQueryFromURI(uri); + } catch (UnsupportedEncodingException e) { + throw new AAIException("AAI_3000"); + } + + List results = queryParser.getQueryBuilder().toList(); + + return reduceToSingleVertex(results, map); + } + + /** + * @param type + * @param map - form [{propname}:{value}] + * @return + * @throws AAIException + */ + public Optional locateUniqueVertex(String type, Map map) throws AAIException { + + return reduceToSingleVertex(locateUniqueVertices(type, map), map); + } + + public List locateUniqueVertices(String type, Map map) throws AAIException { + Introspector obj = this.createIntrospectorFromMap(type, map); + QueryBuilder builder = this.engine.getQueryBuilder().exactMatchQuery(obj); + + return builder.toList(); + } + + private Introspector constructRelationship(String type, Map map) throws AAIUnknownObjectException { + final Introspector relationship = loader.introspectorFromName("relationship"); + relationship.setValue("related-to", type); + final List data = relationship.getValue("relationship-data"); + for (Entry entry : map.entrySet()) { + final Introspector dataObj = loader.introspectorFromName("relationship-data"); + dataObj.setValue("relationship-key", entry.getKey()); + dataObj.setValue("relationship-value", entry.getValue()); + data.add(dataObj.getUnderlyingObject()); + } + + return relationship; + } + + private Introspector createIntrospectorFromMap(String targetNodeType, Map propHash) + throws AAIUnknownObjectException { + final Introspector result = loader.introspectorFromName(targetNodeType); + for (Entry entry : propHash.entrySet()) { + result.setValue(entry.getKey(), entry.getValue()); + } + return result; + } + + private Optional reduceToSingleVertex(List vertices, Map map) throws AAIException { + if (vertices.isEmpty()) { + return Optional.empty(); + } else if (vertices.size() > 1) { + throw new AAIException("AAI_6112", "More than one Node found by getUniqueNode for params: " + map); + } + + return Optional.of(vertices.get(0)); + } + + public List getVertexProperties(Vertex v) { + List retArr = new ArrayList<>(); + if (v == null) { + retArr.add("null Node object passed to showPropertiesForNode()\n"); + } else { + String nodeType; + Object ob = v.property("aai-node-type").orElse(null); + if (ob == null) { + nodeType = "null"; + } else { + nodeType = ob.toString(); + } + + retArr.add(" AAINodeType/VtxID for this Node = [" + nodeType + "/" + v.id() + "]"); + retArr.add(" Property Detail: "); + Iterator> pI = v.properties(); + while (pI.hasNext()) { + VertexProperty tp = pI.next(); + Object val = tp.value(); + retArr.add("Prop: [" + tp.key() + "], val = [" + val + "] "); + } + } + return retArr; + } } diff --git a/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java b/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java index 6b4035c6..a0f6d77e 100644 --- a/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java +++ b/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java @@ -19,6 +19,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.db.props; public class AAIProperties { @@ -34,9 +35,9 @@ public class AAIProperties { public static final String LINKED = "linked"; public static final String DB_ALIAS_SUFFIX = "-local"; public static final String AAI_UUID = "aai-uuid"; - + private AAIProperties() { - + } } diff --git a/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java b/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java index 915db69c..02dede24 100644 --- a/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java +++ b/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java @@ -17,8 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbgen; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Optional; +import java.util.function.Consumer; + import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.io.Io; import org.apache.tinkerpop.gremlin.structure.io.IoRegistry; @@ -28,21 +37,15 @@ import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONReader; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Optional; -import java.util.function.Consumer; - /** - * Constructs GraphSON IO implementations given a {@link Graph} and {@link IoRegistry}. Implementers of the {@link Graph} + * Constructs GraphSON IO implementations given a {@link Graph} and {@link IoRegistry}. Implementers of the + * {@link Graph} * interfaces should see the {@link GraphSONMapper} for information on the expectations for the {@link IoRegistry}. * * @author Stephen Mallette (http://stephen.genoprime.com) */ -public final class GraphSONPartialIO implements Io { +public final class GraphSONPartialIO + implements Io { private final IoRegistry registry; private final Graph graph; private final Optional> onMapper; @@ -76,8 +79,8 @@ public final class GraphSONPartialIO implements Io c.accept(builder)); return builder; } @@ -151,7 +154,8 @@ public final class GraphSONPartialIO implements Io> mapTypeReference = new TypeReference>() { - }; + final TypeReference> mapTypeReference = new TypeReference>() {}; private GraphSONPartialReader(final Builder builder) { mapper = builder.mapper.createMapper(); batchSize = builder.batchSize; unwrapAdjacencyList = builder.unwrapAdjacencyList; - version = ((GraphSONMapper)builder.mapper).getVersion(); + version = ((GraphSONMapper) builder.mapper).getVersion(); reader = GraphSONReader.build().create(); } @@ -94,58 +94,62 @@ public final class GraphSONPartialReader implements GraphReader { * {@code writeVertices} methods or by {@link GryoWriter#writeGraph(OutputStream, Graph)}. * * @param inputStream a stream containing an entire graph of vertices and edges as defined by the accompanying - * {@link GraphSONWriter#writeGraph(OutputStream, Graph)}. + * {@link GraphSONWriter#writeGraph(OutputStream, Graph)}. * @param graphToWriteTo the graph to write to when reading from the stream. */ @Override public void readGraph(final InputStream inputStream, final Graph graphToWriteTo) throws IOException { - // dual pass - create all vertices and store to cache the ids. then create edges. as long as we don't + // dual pass - create all vertices and store to cache the ids. then create edges. as long as we don't // have vertex labels in the output we can't do this single pass - LOGGER.info("Read the Partial Graph"); - final Map cache = new HashMap<>(); + LOGGER.info("Read the Partial Graph"); + final Map cache = new HashMap<>(); final AtomicLong counter = new AtomicLong(0); - + final boolean supportsTx = graphToWriteTo.features().graph().supportsTransactions(); final Graph.Features.EdgeFeatures edgeFeatures = graphToWriteTo.features().edge(); - - readVertexStrings(inputStream).map(FunctionUtils.wrapFunction(line -> readVertex(new ByteArrayInputStream(line.getBytes()), null, null, Direction.IN))).forEach(vertex -> { - try{ - final Attachable attachable = (Attachable) vertex; - cache.put((StarGraph.StarVertex) attachable.get(), attachable.attach(Attachable.Method.create(graphToWriteTo))); - if (supportsTx && counter.incrementAndGet() % batchSize == 0) - graphToWriteTo.tx().commit(); - } - catch(Exception ex){ - LOGGER.info("Error in reading vertex from graphson"+vertex.toString()); - } - }); - + + readVertexStrings(inputStream) + .map(FunctionUtils.wrapFunction( + line -> readVertex(new ByteArrayInputStream(line.getBytes()), null, null, Direction.IN))) + .forEach(vertex -> { + try { + final Attachable attachable = (Attachable) vertex; + cache.put((StarGraph.StarVertex) attachable.get(), + attachable.attach(Attachable.Method.create(graphToWriteTo))); + if (supportsTx && counter.incrementAndGet() % batchSize == 0) + graphToWriteTo.tx().commit(); + } catch (Exception ex) { + LOGGER.info("Error in reading vertex from graphson" + vertex.toString()); + } + }); + cache.entrySet().forEach(kv -> kv.getKey().edges(Direction.IN).forEachRemaining(e -> { - try{ - // can't use a standard Attachable attach method here because we have to use the cache for those - // graphs that don't support userSuppliedIds on edges. note that outVertex/inVertex methods return - // StarAdjacentVertex whose equality should match StarVertex. - final Vertex cachedOutV = cache.get(e.outVertex()); - final Vertex cachedInV = cache.get(e.inVertex()); - - if(cachedOutV != null && cachedInV != null){ - - final Edge newEdge = edgeFeatures.willAllowId(e.id()) ? cachedOutV.addEdge(e.label(), cachedInV, T.id, e.id()) : cachedOutV.addEdge(e.label(), cachedInV); - e.properties().forEachRemaining(p -> newEdge.property(p.key(), p.value())); - } - else{ - LOGGER.debug("Ghost edges from "+ cachedOutV + " to "+ cachedInV); - - } - if (supportsTx && counter.incrementAndGet() % batchSize == 0) - graphToWriteTo.tx().commit(); - } - catch(Exception ex){ - LOGGER.info("Error in writing vertex into graph"+e.toString()); - } + try { + // can't use a standard Attachable attach method here because we have to use the cache for those + // graphs that don't support userSuppliedIds on edges. note that outVertex/inVertex methods return + // StarAdjacentVertex whose equality should match StarVertex. + final Vertex cachedOutV = cache.get(e.outVertex()); + final Vertex cachedInV = cache.get(e.inVertex()); + + if (cachedOutV != null && cachedInV != null) { + + final Edge newEdge = + edgeFeatures.willAllowId(e.id()) ? cachedOutV.addEdge(e.label(), cachedInV, T.id, e.id()) + : cachedOutV.addEdge(e.label(), cachedInV); + e.properties().forEachRemaining(p -> newEdge.property(p.key(), p.value())); + } else { + LOGGER.debug("Ghost edges from " + cachedOutV + " to " + cachedInV); + + } + if (supportsTx && counter.incrementAndGet() % batchSize == 0) + graphToWriteTo.tx().commit(); + } catch (Exception ex) { + LOGGER.info("Error in writing vertex into graph" + e.toString()); + } })); - if (supportsTx) graphToWriteTo.tx().commit(); + if (supportsTx) + graphToWriteTo.tx().commit(); } /** @@ -153,32 +157,35 @@ public final class GraphSONPartialReader implements GraphReader { * {@code writeVertices} methods or by {@link GraphSONWriter#writeGraph(OutputStream, Graph)}. * * @param inputStream a stream containing at least one {@link Vertex} as defined by the accompanying - * {@link GraphWriter#writeVertices(OutputStream, Iterator, Direction)} or - * {@link GraphWriter#writeVertices(OutputStream, Iterator)} methods. + * {@link GraphWriter#writeVertices(OutputStream, Iterator, Direction)} or + * {@link GraphWriter#writeVertices(OutputStream, Iterator)} methods. * @param vertexAttachMethod a function that creates re-attaches a {@link Vertex} to a {@link Host} object. * @param edgeAttachMethod a function that creates re-attaches a {@link Edge} to a {@link Host} object. * @param attachEdgesOfThisDirection only edges of this direction are passed to the {@code edgeMaker}. */ @Override public Iterator readVertices(final InputStream inputStream, - final Function, Vertex> vertexAttachMethod, - final Function, Edge> edgeAttachMethod, - final Direction attachEdgesOfThisDirection) throws IOException { - // return readVertexStrings(inputStream).map(FunctionUtils.wrapFunction(line -> readVertex(new ByteArrayInputStream(line.getBytes()), vertexAttachMethod, edgeAttachMethod, attachEdgesOfThisDirection))).iterator(); + final Function, Vertex> vertexAttachMethod, + final Function, Edge> edgeAttachMethod, final Direction attachEdgesOfThisDirection) + throws IOException { + // return readVertexStrings(inputStream).map(FunctionUtils.wrapFunction(line -> readVertex(new + // ByteArrayInputStream(line.getBytes()), vertexAttachMethod, edgeAttachMethod, + // attachEdgesOfThisDirection))).iterator(); return reader.readVertices(inputStream, vertexAttachMethod, edgeAttachMethod, attachEdgesOfThisDirection); - + } /** - * Read a {@link Vertex} from output generated by any of the {@link GraphSONWriter} {@code writeVertex} or + * Read a {@link Vertex} from output generated by any of the {@link GraphSONWriter} {@code writeVertex} or * {@code writeVertices} methods or by {@link GraphSONWriter#writeGraph(OutputStream, Graph)}. * * @param inputStream a stream containing at least a single vertex as defined by the accompanying - * {@link GraphWriter#writeVertex(OutputStream, Vertex)}. + * {@link GraphWriter#writeVertex(OutputStream, Vertex)}. * @param vertexAttachMethod a function that creates re-attaches a {@link Vertex} to a {@link Host} object. */ @Override - public Vertex readVertex(final InputStream inputStream, final Function, Vertex> vertexAttachMethod) throws IOException { + public Vertex readVertex(final InputStream inputStream, + final Function, Vertex> vertexAttachMethod) throws IOException { return reader.readVertex(inputStream, vertexAttachMethod); } @@ -187,18 +194,18 @@ public final class GraphSONPartialReader implements GraphReader { * {@code writeVertices} methods or by {@link GraphSONWriter#writeGraph(OutputStream, Graph)}. * * @param inputStream a stream containing at least one {@link Vertex} as defined by the accompanying - * {@link GraphWriter#writeVertices(OutputStream, Iterator, Direction)} method. + * {@link GraphWriter#writeVertices(OutputStream, Iterator, Direction)} method. * @param vertexAttachMethod a function that creates re-attaches a {@link Vertex} to a {@link Host} object. * @param edgeAttachMethod a function that creates re-attaches a {@link Edge} to a {@link Host} object. * @param attachEdgesOfThisDirection only edges of this direction are passed to the {@code edgeMaker}. */ @Override public Vertex readVertex(final InputStream inputStream, - final Function, Vertex> vertexAttachMethod, - final Function, Edge> edgeAttachMethod, - final Direction attachEdgesOfThisDirection) throws IOException { - - return reader.readVertex(inputStream, vertexAttachMethod, edgeAttachMethod, attachEdgesOfThisDirection); + final Function, Vertex> vertexAttachMethod, + final Function, Edge> edgeAttachMethod, final Direction attachEdgesOfThisDirection) + throws IOException { + + return reader.readVertex(inputStream, vertexAttachMethod, edgeAttachMethod, attachEdgesOfThisDirection); } /** @@ -206,27 +213,30 @@ public final class GraphSONPartialReader implements GraphReader { * an {@link Edge} passed to {@link GraphSONWriter#writeObject(OutputStream, Object)}. * * @param inputStream a stream containing at least one {@link Edge} as defined by the accompanying - * {@link GraphWriter#writeEdge(OutputStream, Edge)} method. + * {@link GraphWriter#writeEdge(OutputStream, Edge)} method. * @param edgeAttachMethod a function that creates re-attaches a {@link Edge} to a {@link Host} object. */ @Override - public Edge readEdge(final InputStream inputStream, final Function, Edge> edgeAttachMethod) throws IOException { - /*if (version == GraphSONVersion.v1_0) { - final Map edgeData = mapper.readValue(inputStream, mapTypeReference); - - final Map edgeProperties = edgeData.containsKey(GraphSONTokens.PROPERTIES) ? - (Map) edgeData.get(GraphSONTokens.PROPERTIES) : Collections.EMPTY_MAP; - final DetachedEdge edge = new DetachedEdge(edgeData.get(GraphSONTokens.ID), - edgeData.get(GraphSONTokens.LABEL).toString(), - edgeProperties, - Pair.with(edgeData.get(GraphSONTokens.OUT), edgeData.get(GraphSONTokens.OUT_LABEL).toString()), - Pair.with(edgeData.get(GraphSONTokens.IN), edgeData.get(GraphSONTokens.IN_LABEL).toString())); - - return edgeAttachMethod.apply(edge); - } else { - return edgeAttachMethod.apply((DetachedEdge) mapper.readValue(inputStream, Edge.class)); - }*/ - return reader.readEdge(inputStream, edgeAttachMethod); + public Edge readEdge(final InputStream inputStream, final Function, Edge> edgeAttachMethod) + throws IOException { + /* + * if (version == GraphSONVersion.v1_0) { + * final Map edgeData = mapper.readValue(inputStream, mapTypeReference); + * + * final Map edgeProperties = edgeData.containsKey(GraphSONTokens.PROPERTIES) ? + * (Map) edgeData.get(GraphSONTokens.PROPERTIES) : Collections.EMPTY_MAP; + * final DetachedEdge edge = new DetachedEdge(edgeData.get(GraphSONTokens.ID), + * edgeData.get(GraphSONTokens.LABEL).toString(), + * edgeProperties, + * Pair.with(edgeData.get(GraphSONTokens.OUT), edgeData.get(GraphSONTokens.OUT_LABEL).toString()), + * Pair.with(edgeData.get(GraphSONTokens.IN), edgeData.get(GraphSONTokens.IN_LABEL).toString())); + * + * return edgeAttachMethod.apply(edge); + * } else { + * return edgeAttachMethod.apply((DetachedEdge) mapper.readValue(inputStream, Edge.class)); + * } + */ + return reader.readEdge(inputStream, edgeAttachMethod); } /** @@ -235,45 +245,51 @@ public final class GraphSONPartialReader implements GraphReader { * to {@link GraphSONWriter#writeObject(OutputStream, Object)}. * * @param inputStream a stream containing at least one {@link VertexProperty} as written by the accompanying - * {@link GraphWriter#writeVertexProperty(OutputStream, VertexProperty)} method. + * {@link GraphWriter#writeVertexProperty(OutputStream, VertexProperty)} method. * @param vertexPropertyAttachMethod a function that creates re-attaches a {@link VertexProperty} to a - * {@link Host} object. + * {@link Host} object. */ @Override public VertexProperty readVertexProperty(final InputStream inputStream, - final Function, VertexProperty> vertexPropertyAttachMethod) throws IOException { - /*if (version == GraphSONVersion.v1_0) { - final Map vpData = mapper.readValue(inputStream, mapTypeReference); - final Map metaProperties = (Map) vpData.get(GraphSONTokens.PROPERTIES); - final DetachedVertexProperty vp = new DetachedVertexProperty(vpData.get(GraphSONTokens.ID), - vpData.get(GraphSONTokens.LABEL).toString(), - vpData.get(GraphSONTokens.VALUE), metaProperties); - return vertexPropertyAttachMethod.apply(vp); - } else { - return vertexPropertyAttachMethod.apply((DetachedVertexProperty) mapper.readValue(inputStream, VertexProperty.class)); - }*/ - return reader.readVertexProperty(inputStream, vertexPropertyAttachMethod); + final Function, VertexProperty> vertexPropertyAttachMethod) throws IOException { + /* + * if (version == GraphSONVersion.v1_0) { + * final Map vpData = mapper.readValue(inputStream, mapTypeReference); + * final Map metaProperties = (Map) vpData.get(GraphSONTokens.PROPERTIES); + * final DetachedVertexProperty vp = new DetachedVertexProperty(vpData.get(GraphSONTokens.ID), + * vpData.get(GraphSONTokens.LABEL).toString(), + * vpData.get(GraphSONTokens.VALUE), metaProperties); + * return vertexPropertyAttachMethod.apply(vp); + * } else { + * return vertexPropertyAttachMethod.apply((DetachedVertexProperty) mapper.readValue(inputStream, + * VertexProperty.class)); + * } + */ + return reader.readVertexProperty(inputStream, vertexPropertyAttachMethod); } /** - * Read a {@link Property} from output generated by {@link GraphSONWriter#writeProperty(OutputStream, Property)} or + * Read a {@link Property} from output generated by {@link GraphSONWriter#writeProperty(OutputStream, Property)} or * via an {@link Property} passed to {@link GraphSONWriter#writeObject(OutputStream, Object)}. * * @param inputStream a stream containing at least one {@link Property} as written by the accompanying - * {@link GraphWriter#writeProperty(OutputStream, Property)} method. + * {@link GraphWriter#writeProperty(OutputStream, Property)} method. * @param propertyAttachMethod a function that creates re-attaches a {@link Property} to a {@link Host} object. */ @Override public Property readProperty(final InputStream inputStream, - final Function, Property> propertyAttachMethod) throws IOException { - /*if (version == GraphSONVersion.v1_0) { - final Map propertyData = mapper.readValue(inputStream, mapTypeReference); - final DetachedProperty p = new DetachedProperty(propertyData.get(GraphSONTokens.KEY).toString(), propertyData.get(GraphSONTokens.VALUE)); - return propertyAttachMethod.apply(p); - } else { - return propertyAttachMethod.apply((DetachedProperty) mapper.readValue(inputStream, Property.class)); - }*/ - return reader.readProperty(inputStream, propertyAttachMethod); + final Function, Property> propertyAttachMethod) throws IOException { + /* + * if (version == GraphSONVersion.v1_0) { + * final Map propertyData = mapper.readValue(inputStream, mapTypeReference); + * final DetachedProperty p = new DetachedProperty(propertyData.get(GraphSONTokens.KEY).toString(), + * propertyData.get(GraphSONTokens.VALUE)); + * return propertyAttachMethod.apply(p); + * } else { + * return propertyAttachMethod.apply((DetachedProperty) mapper.readValue(inputStream, Property.class)); + * } + */ + return reader.readProperty(inputStream, propertyAttachMethod); } /** @@ -286,18 +302,18 @@ public final class GraphSONPartialReader implements GraphReader { private Stream readVertexStrings(final InputStream inputStream) throws IOException { if (unwrapAdjacencyList) { - final JsonNode root = mapper.readTree(inputStream); + final JsonNode root = mapper.readTree(inputStream); final JsonNode vertices = root.get(GraphSONTokens.VERTICES); - if (!vertices.getNodeType().equals(JsonNodeType.ARRAY)) throw new IOException(String.format("The '%s' key must be an array", GraphSONTokens.VERTICES)); + if (!vertices.getNodeType().equals(JsonNodeType.ARRAY)) + throw new IOException(String.format("The '%s' key must be an array", GraphSONTokens.VERTICES)); return IteratorUtils.stream(vertices.elements()).map(Object::toString); } else { - final BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); + final BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); return br.lines(); } - + } - public static Builder build() { return new Builder(); } @@ -307,9 +323,9 @@ public final class GraphSONPartialReader implements GraphReader { private Mapper mapper = GraphSONMapper.build().create(); private boolean unwrapAdjacencyList = false; - - private Builder() {} + private Builder() { + } /** * Number of mutations to perform before a commit is executed when using @@ -322,7 +338,7 @@ public final class GraphSONPartialReader implements GraphReader { /** * Override all of the {@link GraphSONMapper} builder - * options with this mapper. If this value is set to something other than null then that value will be + * options with this mapper. If this value is set to something other than null then that value will be * used to construct the writer. */ public Builder mapper(final Mapper mapper) { @@ -333,11 +349,11 @@ public final class GraphSONPartialReader implements GraphReader { /** * If the adjacency list is wrapped in a JSON object, as is done when writing a graph with * {@link GraphSONWriter.Builder#wrapAdjacencyList} set to {@code true}, this setting needs to be set to - * {@code true} to properly read it. By default, this value is {@code false} and the adjacency list is + * {@code true} to properly read it. By default, this value is {@code false} and the adjacency list is * simply read as line delimited vertices. *

* By setting this value to {@code true}, the generated JSON is no longer "splittable" by line and thus not - * suitable for OLAP processing. Furthermore, reading this format of the JSON with + * suitable for OLAP processing. Furthermore, reading this format of the JSON with * {@link GraphSONPartialReader#readGraph(InputStream, Graph)} or * {@link GraphSONPartialReader#readVertices(InputStream, Function, Function, Direction)} requires that the * entire JSON object be read into memory, so it is best saved for "small" graphs. diff --git a/aai-core/src/main/java/org/onap/aai/dbgen/PropertyLimitDesc.java b/aai-core/src/main/java/org/onap/aai/dbgen/PropertyLimitDesc.java index 2a1a4c07..1221c6cc 100644 --- a/aai-core/src/main/java/org/onap/aai/dbgen/PropertyLimitDesc.java +++ b/aai-core/src/main/java/org/onap/aai/dbgen/PropertyLimitDesc.java @@ -17,10 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbgen; public enum PropertyLimitDesc { - SHOW_NONE, - SHOW_ALL, - SHOW_NAME_AND_KEYS_ONLY + SHOW_NONE, SHOW_ALL, SHOW_NAME_AND_KEYS_ONLY } diff --git a/aai-core/src/main/java/org/onap/aai/dbgen/SchemaGenerator.java b/aai-core/src/main/java/org/onap/aai/dbgen/SchemaGenerator.java index 11b96ae1..bfd1f55b 100644 --- a/aai-core/src/main/java/org/onap/aai/dbgen/SchemaGenerator.java +++ b/aai-core/src/main/java/org/onap/aai/dbgen/SchemaGenerator.java @@ -17,8 +17,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbgen; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.common.collect.Multimap; + import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -26,160 +31,156 @@ import java.util.Optional; import java.util.Set; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.janusgraph.core.Cardinality; +import org.janusgraph.core.JanusGraph; +import org.janusgraph.core.Multiplicity; +import org.janusgraph.core.PropertyKey; +import org.janusgraph.core.schema.JanusGraphManagement; import org.onap.aai.config.SpringContextAware; import org.onap.aai.db.props.AAIProperties; import org.onap.aai.edges.EdgeIngestor; +import org.onap.aai.edges.EdgeRule; import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; import org.onap.aai.introspection.*; import org.onap.aai.logging.LogFormatTools; import org.onap.aai.schema.enums.PropertyMetadata; -import org.onap.aai.edges.EdgeRule; import org.onap.aai.setup.SchemaVersions; import org.onap.aai.util.AAIConfig; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.common.collect.Multimap; -import org.janusgraph.core.Cardinality; -import org.janusgraph.core.Multiplicity; -import org.janusgraph.core.PropertyKey; -import org.janusgraph.core.JanusGraph; -import org.janusgraph.core.schema.JanusGraphManagement; - public class SchemaGenerator { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(SchemaGenerator.class); - - /** - * Load schema into JanusGraph. - * - * @param graph - * the graph - * @param graphMgmt - * the graph mgmt - */ - public static void loadSchemaIntoJanusGraph(final JanusGraph graph, final JanusGraphManagement graphMgmt, - String backend) { - - try { - AAIConfig.init(); - } catch (Exception ex) { - LOGGER.error(" ERROR - Could not run AAIConfig.init(). " + LogFormatTools.getStackTop(ex)); - //System.out.println(" ERROR - Could not run AAIConfig.init(). "); - System.exit(1); - } - - // NOTE - JanusGraph 0.5.3 doesn't keep a list of legal node Labels. - // They are only used when a vertex is actually being created. - // JanusGraph 1.1 will keep track (we think). - - // Use EdgeRules to make sure edgeLabels are defined in the db. NOTE: - // the multiplicty used here is - // always "MULTI". This is not the same as our internal "Many2Many", - // "One2One", "One2Many" or "Many2One" - // We use the same edge-label for edges between many different types of - // nodes and our internal - // multiplicty definitions depends on which two types of nodes are being - // connected. - - Multimap edges = null; - Set labels = new HashSet<>(); - - EdgeIngestor edgeIngestor = SpringContextAware.getBean(EdgeIngestor.class); - - try { - edges = edgeIngestor.getAllCurrentRules(); - } catch (EdgeRuleNotFoundException e) { - LOGGER.error("Unable to find all rules {}", LogFormatTools.getStackTop(e)); - } - - for (EdgeRule rule : edges.values()) { - labels.add(rule.getLabel()); - } - - for (String label : labels) { - if (graphMgmt.containsRelationType(label)) { - String dmsg = " EdgeLabel [" + label + "] already existed. "; - LOGGER.debug(dmsg); - } else { - String dmsg = "Making EdgeLabel: [" + label + "]"; - LOGGER.debug(dmsg); - graphMgmt.makeEdgeLabel(label).multiplicity(Multiplicity.valueOf("MULTI")).make(); - } - } - - Loader loader = LoaderUtil.getLatestVersion(); - - Map objs = loader.getAllObjects(); - Map seenProps = new HashMap<>(); - - for (Introspector obj : objs.values()) { - for (String propName : obj.getProperties()) { - String dbPropName = propName; - Optional alias = obj.getPropertyMetadata(propName, PropertyMetadata.DB_ALIAS); - if (alias.isPresent()) { - dbPropName = alias.get(); - } - if (graphMgmt.containsRelationType(dbPropName)) { - String dmsg = " PropertyKey [" + dbPropName + "] already existed in the DB. "; - LOGGER.debug(dmsg); - } else { - Class type = obj.getClass(propName); - Cardinality cardinality = Cardinality.SINGLE; - boolean process = false; - if (obj.isListType(propName) && obj.isSimpleGenericType(propName)) { - cardinality = Cardinality.SET; - type = obj.getGenericTypeClass(propName); - process = true; - } else if (obj.isSimpleType(propName)) { - process = true; - } - - if (process) { - - String imsg = "Creating PropertyKey: [" + dbPropName + "], [" + type.getSimpleName() + "], [" - + cardinality + "]"; - LOGGER.info(imsg); - PropertyKey propK; - if (!seenProps.containsKey(dbPropName)) { - propK = graphMgmt.makePropertyKey(dbPropName).dataType(type).cardinality(cardinality) - .make(); - seenProps.put(dbPropName, propK); - } else { - propK = seenProps.get(dbPropName); - } - if (graphMgmt.containsGraphIndex(dbPropName)) { - String dmsg = " Index [" + dbPropName + "] already existed in the DB. "; - LOGGER.debug(dmsg); - } else { - if (obj.getIndexedProperties().contains(propName)) { - if (obj.getUniqueProperties().contains(propName)) { - imsg = "Add Unique index for PropertyKey: [" + dbPropName + "]"; - LOGGER.info(imsg); - graphMgmt.buildIndex(dbPropName, Vertex.class).addKey(propK).unique() - .buildCompositeIndex(); - } else { - imsg = "Add index for PropertyKey: [" + dbPropName + "]"; - LOGGER.info(imsg); - graphMgmt.buildIndex(dbPropName, Vertex.class).addKey(propK).buildCompositeIndex(); - } - } else { - imsg = "No index added for PropertyKey: [" + dbPropName + "]"; - LOGGER.info(imsg); - } - } - } - } - } - } - - String imsg = "-- About to call graphMgmt commit"; - LOGGER.info(imsg); - if(backend != null){ - LOGGER.info("Successfully loaded the schema to " + backend); - } - - graphMgmt.commit(); - } + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(SchemaGenerator.class); + + /** + * Load schema into JanusGraph. + * + * @param graph + * the graph + * @param graphMgmt + * the graph mgmt + */ + public static void loadSchemaIntoJanusGraph(final JanusGraph graph, final JanusGraphManagement graphMgmt, + String backend) { + + try { + AAIConfig.init(); + } catch (Exception ex) { + LOGGER.error(" ERROR - Could not run AAIConfig.init(). " + LogFormatTools.getStackTop(ex)); + // System.out.println(" ERROR - Could not run AAIConfig.init(). "); + System.exit(1); + } + + // NOTE - JanusGraph 0.5.3 doesn't keep a list of legal node Labels. + // They are only used when a vertex is actually being created. + // JanusGraph 1.1 will keep track (we think). + + // Use EdgeRules to make sure edgeLabels are defined in the db. NOTE: + // the multiplicty used here is + // always "MULTI". This is not the same as our internal "Many2Many", + // "One2One", "One2Many" or "Many2One" + // We use the same edge-label for edges between many different types of + // nodes and our internal + // multiplicty definitions depends on which two types of nodes are being + // connected. + + Multimap edges = null; + Set labels = new HashSet<>(); + + EdgeIngestor edgeIngestor = SpringContextAware.getBean(EdgeIngestor.class); + + try { + edges = edgeIngestor.getAllCurrentRules(); + } catch (EdgeRuleNotFoundException e) { + LOGGER.error("Unable to find all rules {}", LogFormatTools.getStackTop(e)); + } + + for (EdgeRule rule : edges.values()) { + labels.add(rule.getLabel()); + } + + for (String label : labels) { + if (graphMgmt.containsRelationType(label)) { + String dmsg = " EdgeLabel [" + label + "] already existed. "; + LOGGER.debug(dmsg); + } else { + String dmsg = "Making EdgeLabel: [" + label + "]"; + LOGGER.debug(dmsg); + graphMgmt.makeEdgeLabel(label).multiplicity(Multiplicity.valueOf("MULTI")).make(); + } + } + + Loader loader = LoaderUtil.getLatestVersion(); + + Map objs = loader.getAllObjects(); + Map seenProps = new HashMap<>(); + + for (Introspector obj : objs.values()) { + for (String propName : obj.getProperties()) { + String dbPropName = propName; + Optional alias = obj.getPropertyMetadata(propName, PropertyMetadata.DB_ALIAS); + if (alias.isPresent()) { + dbPropName = alias.get(); + } + if (graphMgmt.containsRelationType(dbPropName)) { + String dmsg = " PropertyKey [" + dbPropName + "] already existed in the DB. "; + LOGGER.debug(dmsg); + } else { + Class type = obj.getClass(propName); + Cardinality cardinality = Cardinality.SINGLE; + boolean process = false; + if (obj.isListType(propName) && obj.isSimpleGenericType(propName)) { + cardinality = Cardinality.SET; + type = obj.getGenericTypeClass(propName); + process = true; + } else if (obj.isSimpleType(propName)) { + process = true; + } + + if (process) { + + String imsg = "Creating PropertyKey: [" + dbPropName + "], [" + type.getSimpleName() + "], [" + + cardinality + "]"; + LOGGER.info(imsg); + PropertyKey propK; + if (!seenProps.containsKey(dbPropName)) { + propK = graphMgmt.makePropertyKey(dbPropName).dataType(type).cardinality(cardinality) + .make(); + seenProps.put(dbPropName, propK); + } else { + propK = seenProps.get(dbPropName); + } + if (graphMgmt.containsGraphIndex(dbPropName)) { + String dmsg = " Index [" + dbPropName + "] already existed in the DB. "; + LOGGER.debug(dmsg); + } else { + if (obj.getIndexedProperties().contains(propName)) { + if (obj.getUniqueProperties().contains(propName)) { + imsg = "Add Unique index for PropertyKey: [" + dbPropName + "]"; + LOGGER.info(imsg); + graphMgmt.buildIndex(dbPropName, Vertex.class).addKey(propK).unique() + .buildCompositeIndex(); + } else { + imsg = "Add index for PropertyKey: [" + dbPropName + "]"; + LOGGER.info(imsg); + graphMgmt.buildIndex(dbPropName, Vertex.class).addKey(propK).buildCompositeIndex(); + } + } else { + imsg = "No index added for PropertyKey: [" + dbPropName + "]"; + LOGGER.info(imsg); + } + } + } + } + } + } + + String imsg = "-- About to call graphMgmt commit"; + LOGGER.info(imsg); + if (backend != null) { + LOGGER.info("Successfully loaded the schema to " + backend); + } + + graphMgmt.commit(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java index 84218e85..0e7c0578 100644 --- a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java +++ b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java @@ -19,8 +19,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbmap; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -33,16 +37,13 @@ import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.io.IoCore; +import org.janusgraph.core.JanusGraph; +import org.janusgraph.core.JanusGraphFactory; +import org.janusgraph.core.schema.JanusGraphManagement; import org.onap.aai.dbgen.SchemaGenerator; import org.onap.aai.exceptions.AAIException; import org.onap.aai.util.AAIConstants; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import org.janusgraph.core.JanusGraphFactory; -import org.janusgraph.core.JanusGraph; -import org.janusgraph.core.schema.JanusGraphManagement; - /** * Database Mapping class which acts as the middle man between the REST * interface objects and JanusGraph DB objects. This class provides methods to commit @@ -52,7 +53,7 @@ import org.janusgraph.core.schema.JanusGraphManagement; * rules such as keys/required properties are handled by calling DBMeth methods * which are driven by a specification file in json. * - + * */ public class AAIGraph { @@ -63,8 +64,6 @@ public class AAIGraph { private static final String CACHED_DB = "cached"; private static boolean isInit = false; - - /** * Instantiates a new AAI graph. */ @@ -85,14 +84,15 @@ public class AAIGraph { throw new RuntimeException("Failed to instantiate graphs", e); } } - + private static class Helper { private static final AAIGraph INSTANCE = new AAIGraph(); + private Helper() { - + } } - + /** * Gets the single instance of AAIGraph. * @@ -106,16 +106,18 @@ public class AAIGraph { public static boolean isInit() { return isInit; } - + private void loadGraph(String name, String configPath, String serviceName) throws Exception { // Graph being opened by JanusGraphFactory is being placed in hashmap to be used later // These graphs shouldn't be closed until the application shutdown try { - PropertiesConfiguration propertiesConfiguration = new AAIGraphConfig.Builder(configPath).forService(serviceName).withGraphType(name).buildConfiguration(); + PropertiesConfiguration propertiesConfiguration = new AAIGraphConfig.Builder(configPath) + .forService(serviceName).withGraphType(name).buildConfiguration(); JanusGraph graph = JanusGraphFactory.open(propertiesConfiguration); Properties graphProps = new Properties(); - propertiesConfiguration.getKeys().forEachRemaining(k -> graphProps.setProperty(k, propertiesConfiguration.getString(k))); + propertiesConfiguration.getKeys() + .forEachRemaining(k -> graphProps.setProperty(k, propertiesConfiguration.getString(k))); if ("inmemory".equals(graphProps.get("storage.backend"))) { // Load the propertyKeys, indexes and edge-Labels into the DB @@ -149,8 +151,7 @@ public class AAIGraph { transaction.tx().commit(); logAndPrint(logger, "Snapshot loaded to inmemory graph."); } catch (Exception e) { - logAndPrint(logger, - "ERROR: Could not load datasnapshot to in memory graph. \n" + logAndPrint(logger, "ERROR: Could not load datasnapshot to in memory graph. \n" + ExceptionUtils.getFullStackTrace(e)); throw new RuntimeException(e); } @@ -161,9 +162,9 @@ public class AAIGraph { private void loadSchema(JanusGraph graph) { // Load the propertyKeys, indexes and edge-Labels into the DB JanusGraphManagement graphMgt = graph.openManagement(); - + System.out.println("-- loading schema into JanusGraph"); - SchemaGenerator.loadSchemaIntoJanusGraph( graph, graphMgt, "inmemory"); + SchemaGenerator.loadSchemaIntoJanusGraph(graph, graphMgt, "inmemory"); } /** @@ -181,16 +182,16 @@ public class AAIGraph { public JanusGraph getGraph() { return graphs.get(REALTIME_DB); } - + public void graphShutdown(DBConnectionType connectionType) { - + graphs.get(this.getGraphName(connectionType)).close(); } - + public JanusGraph getGraph(DBConnectionType connectionType) { return graphs.get(this.getGraphName(connectionType)); } - + private String getGraphName(DBConnectionType connectionType) { String graphName = ""; if (DBConnectionType.CACHED.equals(connectionType)) { @@ -198,10 +199,10 @@ public class AAIGraph { } else if (DBConnectionType.REALTIME.equals(connectionType)) { graphName = this.REALTIME_DB; } - + return graphName; } - + private void logAndPrint(EELFLogger logger, String msg) { System.out.println(msg); logger.info(msg); diff --git a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraphConfig.java b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraphConfig.java index eff7f0ec..d2f81610 100644 --- a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraphConfig.java +++ b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraphConfig.java @@ -17,18 +17,16 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbmap; +import static org.janusgraph.graphdb.configuration.GraphDatabaseConfiguration.*; + import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Iterators; -import org.janusgraph.diskstorage.configuration.ConfigElement; -import org.janusgraph.diskstorage.configuration.backend.CommonsConfiguration; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.PropertiesConfiguration; -import org.apache.commons.lang.StringUtils; import java.io.File; import java.io.FileNotFoundException; @@ -37,68 +35,74 @@ import java.util.Iterator; import java.util.Objects; import java.util.regex.Pattern; -import static org.janusgraph.graphdb.configuration.GraphDatabaseConfiguration.*; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.lang.StringUtils; +import org.janusgraph.diskstorage.configuration.ConfigElement; +import org.janusgraph.diskstorage.configuration.backend.CommonsConfiguration; /** * For building a config that JanusGraphFactory.open can use with an identifiable graph.unique-instance-id */ public class AAIGraphConfig { - private static final EELFLogger logger = EELFManager.getInstance().getLogger(AAIGraphConfig.class); - - private AAIGraphConfig(){}; - - public PropertiesConfiguration getCc(String configPath, String graphType, String service) throws ConfigurationException, FileNotFoundException { + private static final EELFLogger logger = EELFManager.getInstance().getLogger(AAIGraphConfig.class); - PropertiesConfiguration cc = this.loadJanusGraphPropFile(configPath); + private AAIGraphConfig() { + }; - String uid = ManagementFactory.getRuntimeMXBean().getName() + "_" + service + "_" + graphType + "_" + System.currentTimeMillis(); - for (char c : ConfigElement.ILLEGAL_CHARS) { - uid = StringUtils.replaceChars(uid, c,'_'); - } + public PropertiesConfiguration getCc(String configPath, String graphType, String service) + throws ConfigurationException, FileNotFoundException { - cc.addProperty("graph.unique-instance-id", uid); + PropertiesConfiguration cc = this.loadJanusGraphPropFile(configPath); - return cc; - } + String uid = ManagementFactory.getRuntimeMXBean().getName() + "_" + service + "_" + graphType + "_" + + System.currentTimeMillis(); + for (char c : ConfigElement.ILLEGAL_CHARS) { + uid = StringUtils.replaceChars(uid, c, '_'); + } + cc.addProperty("graph.unique-instance-id", uid); - private PropertiesConfiguration loadJanusGraphPropFile(String shortcutOrFile) throws ConfigurationException, FileNotFoundException { - File file = new File(shortcutOrFile); - if (file.exists()) { - PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration(); - propertiesConfiguration.setAutoSave(false); - propertiesConfiguration.load(shortcutOrFile); - return propertiesConfiguration; - } else { - throw new FileNotFoundException(shortcutOrFile); - } - } + return cc; + } - public static class Builder { - private String configPath; - private String graphType; - private String service; + private PropertiesConfiguration loadJanusGraphPropFile(String shortcutOrFile) + throws ConfigurationException, FileNotFoundException { + File file = new File(shortcutOrFile); + if (file.exists()) { + PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration(); + propertiesConfiguration.setAutoSave(false); + propertiesConfiguration.load(shortcutOrFile); + return propertiesConfiguration; + } else { + throw new FileNotFoundException(shortcutOrFile); + } + } - public Builder(String configPath) { - this.configPath = configPath; - } + public static class Builder { + private String configPath; + private String graphType; + private String service; - public Builder withGraphType(String graphType) { - this.graphType = Objects.toString(graphType, "NA"); - return this; - } + public Builder(String configPath) { + this.configPath = configPath; + } - public Builder forService(String service) { - this.service = Objects.toString(service, "NA"); - return this; - } + public Builder withGraphType(String graphType) { + this.graphType = Objects.toString(graphType, "NA"); + return this; + } - public PropertiesConfiguration buildConfiguration() throws ConfigurationException, FileNotFoundException { - return new AAIGraphConfig().getCc(this.configPath, this.graphType, this.service); - } + public Builder forService(String service) { + this.service = Objects.toString(service, "NA"); + return this; + } - } + public PropertiesConfiguration buildConfiguration() throws ConfigurationException, FileNotFoundException { + return new AAIGraphConfig().getCc(this.configPath, this.graphType, this.service); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/dbmap/DBConnectionType.java b/aai-core/src/main/java/org/onap/aai/dbmap/DBConnectionType.java index f0b6c144..b100cad8 100644 --- a/aai-core/src/main/java/org/onap/aai/dbmap/DBConnectionType.java +++ b/aai-core/src/main/java/org/onap/aai/dbmap/DBConnectionType.java @@ -17,9 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbmap; public enum DBConnectionType { - REALTIME, - CACHED + REALTIME, CACHED } diff --git a/aai-core/src/main/java/org/onap/aai/dbmap/InMemoryGraph.java b/aai-core/src/main/java/org/onap/aai/dbmap/InMemoryGraph.java index 84e15479..a5d3cda7 100644 --- a/aai-core/src/main/java/org/onap/aai/dbmap/InMemoryGraph.java +++ b/aai-core/src/main/java/org/onap/aai/dbmap/InMemoryGraph.java @@ -17,133 +17,129 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbmap; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; - import java.util.Properties; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.tinkerpop.gremlin.structure.io.IoCore; -import org.onap.aai.dbgen.GraphSONPartialIO; -import org.onap.aai.dbgen.SchemaGenerator; -import org.onap.aai.logging.LogFormatTools; - -import org.janusgraph.core.JanusGraphFactory; import org.janusgraph.core.JanusGraph; +import org.janusgraph.core.JanusGraphFactory; import org.janusgraph.core.JanusGraphTransaction; import org.janusgraph.core.schema.JanusGraphManagement; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; +import org.onap.aai.dbgen.GraphSONPartialIO; +import org.onap.aai.dbgen.SchemaGenerator; +import org.onap.aai.logging.LogFormatTools; public class InMemoryGraph { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(InMemoryGraph.class); - private JanusGraph graph = null; - - - public InMemoryGraph(Builder builder) throws IOException { - /* - * Create a In-memory graph - */ - InputStream is = new FileInputStream(builder.propertyFile); - try { - graph = JanusGraphFactory.open(builder.propertyFile); - - Properties graphProps = new Properties(); - graphProps.load(is); - JanusGraphManagement graphMgt = graph.openManagement(); - if(builder.isSchemaEnabled){ - LOGGER.info("Schema Enabled"); - SchemaGenerator.loadSchemaIntoJanusGraph(graph, graphMgt, graphProps.getProperty("storage.backend")); + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(InMemoryGraph.class); + private JanusGraph graph = null; + + public InMemoryGraph(Builder builder) throws IOException { + /* + * Create a In-memory graph + */ + InputStream is = new FileInputStream(builder.propertyFile); + try { + graph = JanusGraphFactory.open(builder.propertyFile); + + Properties graphProps = new Properties(); + graphProps.load(is); + JanusGraphManagement graphMgt = graph.openManagement(); + if (builder.isSchemaEnabled) { + LOGGER.info("Schema Enabled"); + SchemaGenerator.loadSchemaIntoJanusGraph(graph, graphMgt, graphProps.getProperty("storage.backend")); + } + JanusGraphTransaction transaction = graph.newTransaction(); + LOGGER.info("Loading snapshot"); + if (builder.isPartialGraph) { + if ((builder.graphsonLocation != null) && (builder.graphsonLocation.length() > 0)) { + transaction.io(GraphSONPartialIO.build()).readGraph(builder.graphsonLocation); + } else { + transaction.io(GraphSONPartialIO.build()).reader().create().readGraph(builder.seqInputStream, + graph); + } + } else { + if ((builder.graphsonLocation != null) && (builder.graphsonLocation.length() > 0)) { + transaction.io(IoCore.graphson()).readGraph(builder.graphsonLocation); + } else { + transaction.io(IoCore.graphson()).reader().create().readGraph(builder.seqInputStream, graph); + } } - JanusGraphTransaction transaction = graph.newTransaction(); - LOGGER.info("Loading snapshot"); - if(builder.isPartialGraph){ - if ( (builder.graphsonLocation != null) && (builder.graphsonLocation.length() > 0) ) { - transaction.io(GraphSONPartialIO.build()).readGraph(builder.graphsonLocation); - } - else { - transaction.io(GraphSONPartialIO.build()).reader().create().readGraph(builder.seqInputStream, graph); - } - } - else{ - if ( (builder.graphsonLocation != null) && (builder.graphsonLocation.length() > 0) ) { - transaction.io(IoCore.graphson()).readGraph(builder.graphsonLocation); - } - else { - transaction.io(IoCore.graphson()).reader().create().readGraph(builder.seqInputStream, graph); - } - } - transaction.commit(); - - } catch (Exception e) { - // TODO : Changesysout to logger - e.printStackTrace(); - LOGGER.error( - "ERROR: Could not load datasnapshot to in memory graph. \n" + LogFormatTools.getStackTop(e)); - throw new IllegalStateException("Could not load datasnapshot to in memory graph"); - - } - finally{ - is.close(); - } - - } - - public static class Builder { - private String graphsonLocation = ""; - private String propertyFile = ""; - private boolean isSchemaEnabled = false; - private InputStream seqInputStream = null; - private boolean isPartialGraph = false; - - - /* - * Builder constructor doesnt do anything - */ - public Builder() { - //Do nothing - } - - public InMemoryGraph build(String graphsonFile, String propertyFile, boolean isSchemaEnabled) throws IOException { - this.graphsonLocation = graphsonFile; - this.propertyFile = propertyFile; - this.isSchemaEnabled = isSchemaEnabled; - return new InMemoryGraph(this); - } - - public InMemoryGraph build(InputStream sis, String propertyFile, boolean isSchemaEnabled) throws IOException { - this.graphsonLocation = null; - this.propertyFile = propertyFile; - this.isSchemaEnabled = isSchemaEnabled; - this.seqInputStream = sis; - return new InMemoryGraph(this); - } - - public InMemoryGraph build(String graphsonFile, String propertyFile, boolean isSchemaEnabled, boolean isPartialGraph) throws IOException { - this.graphsonLocation = graphsonFile; - this.propertyFile = propertyFile; - this.isSchemaEnabled = isSchemaEnabled; - this.isPartialGraph = isPartialGraph; - return new InMemoryGraph(this); - } - - public InMemoryGraph build(InputStream sis, String propertyFile, boolean isSchemaEnabled, boolean isPartialGraph) throws IOException { - this.graphsonLocation = null; - this.propertyFile = propertyFile; - this.isSchemaEnabled = isSchemaEnabled; - this.seqInputStream = sis; - this.isPartialGraph = isPartialGraph; - return new InMemoryGraph(this); - } - } - - public JanusGraph getGraph() { - return graph; - } + transaction.commit(); + + } catch (Exception e) { + // TODO : Changesysout to logger + e.printStackTrace(); + LOGGER.error("ERROR: Could not load datasnapshot to in memory graph. \n" + LogFormatTools.getStackTop(e)); + throw new IllegalStateException("Could not load datasnapshot to in memory graph"); + + } finally { + is.close(); + } + + } + + public static class Builder { + private String graphsonLocation = ""; + private String propertyFile = ""; + private boolean isSchemaEnabled = false; + private InputStream seqInputStream = null; + private boolean isPartialGraph = false; + + /* + * Builder constructor doesnt do anything + */ + public Builder() { + // Do nothing + } + + public InMemoryGraph build(String graphsonFile, String propertyFile, boolean isSchemaEnabled) + throws IOException { + this.graphsonLocation = graphsonFile; + this.propertyFile = propertyFile; + this.isSchemaEnabled = isSchemaEnabled; + return new InMemoryGraph(this); + } + + public InMemoryGraph build(InputStream sis, String propertyFile, boolean isSchemaEnabled) throws IOException { + this.graphsonLocation = null; + this.propertyFile = propertyFile; + this.isSchemaEnabled = isSchemaEnabled; + this.seqInputStream = sis; + return new InMemoryGraph(this); + } + + public InMemoryGraph build(String graphsonFile, String propertyFile, boolean isSchemaEnabled, + boolean isPartialGraph) throws IOException { + this.graphsonLocation = graphsonFile; + this.propertyFile = propertyFile; + this.isSchemaEnabled = isSchemaEnabled; + this.isPartialGraph = isPartialGraph; + return new InMemoryGraph(this); + } + + public InMemoryGraph build(InputStream sis, String propertyFile, boolean isSchemaEnabled, + boolean isPartialGraph) throws IOException { + this.graphsonLocation = null; + this.propertyFile = propertyFile; + this.isSchemaEnabled = isSchemaEnabled; + this.seqInputStream = sis; + this.isPartialGraph = isPartialGraph; + return new InMemoryGraph(this); + } + } + + public JanusGraph getGraph() { + return graph; + } } diff --git a/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java b/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java index 14550891..44ff599f 100644 --- a/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java +++ b/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java @@ -19,16 +19,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dmaap; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; + import java.util.Objects; import java.util.UUID; + import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; + import org.apache.log4j.MDC; import org.json.JSONException; import org.json.JSONObject; @@ -66,7 +70,7 @@ public class AAIDmaapEventJMSConsumer implements MessageListener { @Override public void onMessage(Message message) { - if(restTemplate == null){ + if (restTemplate == null) { return; } @@ -98,7 +102,7 @@ public class AAIDmaapEventJMSConsumer implements MessageListener { eventName = jo.getString(EVENT_TOPIC); } - LoggingContext.targetEntity ("DMAAP"); + LoggingContext.targetEntity("DMAAP"); if (jo.getString(EVENT_TOPIC) != null) { eventName = jo.getString(EVENT_TOPIC); LoggingContext.targetServiceName(eventName); @@ -107,11 +111,11 @@ public class AAIDmaapEventJMSConsumer implements MessageListener { LoggingContext.statusCode(StatusCode.COMPLETE); LoggingContext.responseCode(LoggingContext.SUCCESS); LOGGER.info(eventName + "|" + aaiEvent); - + HttpEntity httpEntity = new HttpEntity(aaiEvent, httpHeaders); String transportType = environment.getProperty("dmaap.ribbon.transportType", "http"); - String baseUrl = transportType + "://" + environment.getProperty("dmaap.ribbon.listOfServers"); + String baseUrl = transportType + "://" + environment.getProperty("dmaap.ribbon.listOfServers"); String endpoint = "/events/" + eventName; if ("AAI-EVENT".equals(eventName)) { @@ -123,11 +127,13 @@ public class AAIDmaapEventJMSConsumer implements MessageListener { } catch (JMSException | JSONException e) { LoggingContext.statusCode(StatusCode.ERROR); LoggingContext.responseCode(LoggingContext.DATA_ERROR); - LOGGER.error("AAI_7350 Error parsing aaievent jsm message for sending to dmaap. {} {}", jsmMessageTxt, LogFormatTools.getStackTop(e)); + LOGGER.error("AAI_7350 Error parsing aaievent jsm message for sending to dmaap. {} {}", jsmMessageTxt, + LogFormatTools.getStackTop(e)); } catch (Exception e) { LoggingContext.statusCode(StatusCode.ERROR); LoggingContext.responseCode(LoggingContext.AVAILABILITY_TIMEOUT_ERROR); - LOGGER.error("AAI_7350 Error sending message to dmaap. {} {}" , jsmMessageTxt, LogFormatTools.getStackTop(e)); + LOGGER.error("AAI_7350 Error sending message to dmaap. {} {}", jsmMessageTxt, + LogFormatTools.getStackTop(e)); } } diff --git a/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSProducer.java b/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSProducer.java index 35e1a4a5..4036b907 100644 --- a/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSProducer.java +++ b/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSProducer.java @@ -19,6 +19,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dmaap; import org.apache.activemq.ActiveMQConnectionFactory; @@ -33,16 +34,17 @@ public class AAIDmaapEventJMSProducer implements MessageProducer { private JmsTemplate jmsTemplate; public AAIDmaapEventJMSProducer() { - if("true".equals(AAIConfig.get("aai.jms.enable", "true"))){ + if ("true".equals(AAIConfig.get("aai.jms.enable", "true"))) { this.jmsTemplate = new JmsTemplate(); String activeMqTcpUrl = System.getProperty("activemq.tcp.url", "tcp://localhost:61547"); - this.jmsTemplate.setConnectionFactory(new CachingConnectionFactory(new ActiveMQConnectionFactory(activeMqTcpUrl))); + this.jmsTemplate + .setConnectionFactory(new CachingConnectionFactory(new ActiveMQConnectionFactory(activeMqTcpUrl))); this.jmsTemplate.setDefaultDestination(new ActiveMQQueue("IN_QUEUE")); } } public void sendMessageToDefaultDestination(JSONObject finalJson) { - if(jmsTemplate != null){ + if (jmsTemplate != null) { jmsTemplate.convertAndSend(finalJson.toString()); CachingConnectionFactory ccf = (CachingConnectionFactory) this.jmsTemplate.getConnectionFactory(); ccf.destroy(); diff --git a/aai-core/src/main/java/org/onap/aai/dmaap/MessageProducer.java b/aai-core/src/main/java/org/onap/aai/dmaap/MessageProducer.java index c7edfd25..9b17d881 100644 --- a/aai-core/src/main/java/org/onap/aai/dmaap/MessageProducer.java +++ b/aai-core/src/main/java/org/onap/aai/dmaap/MessageProducer.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dmaap; import org.json.JSONObject; diff --git a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResource.java b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResource.java index 3048c119..ddeabf07 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResource.java +++ b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResource.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.model; import com.google.common.collect.Multimap; @@ -24,651 +25,650 @@ import com.google.common.collect.Multimap; import java.util.ArrayList; import java.util.Map; - public class AAIResource { - private AAIResource parent; - private AAIResources children; - - private AAIResourceKeys aaiResourceKeys; - - private String namespace; // /Network/Vces/Vce/PortGroups/PortGroup/CvlanTags/CvlanTag -> "Network" - - private String resourceType; // node or container - private String resourceClassName; - private String simpleName; // Vce - private String fullName; // /Network/Vces/Vce/PortGroups/PortGroup/CvlanTags/CvlanTag - private String uri; // /network/vces/vce/{vnf-id}/port-groups/port-group/{interface-name}/cvlan-tags/cvlan-tag/{cvlan-tag} - private String apiVersion; - private String relationshipListClass; - private String relationshipUtils; - - private Map PropertyDataTypeMap; - private Multimap NodeMapIndexedProps; - private Multimap NodeAltKey1Props; - private Multimap NodeDependencies; - private Multimap NodeKeyProps; - private Multimap NodeReqProps; - private Multimap NodeNameProps; - private Multimap NodeUniqueProps; - - // if new dataTypes are added - make sure to update getAllFields() method below - private ArrayList stringFields; - private ArrayList stringListFields; - private ArrayList longFields; - private ArrayList intFields; - private ArrayList shortFields; - private ArrayList booleanFields; - - private ArrayList requiredFields; - private ArrayList orderedFields; - private AAIResource recurseToResource; - private boolean allowDirectWrite; - private boolean allowDirectRead; - private ArrayList autoGenUuidFields; - - /** - * Gets the parent. - * - * @return the parent - */ - public AAIResource getParent() { - return parent; - } - - /** - * Sets the parent. - * - * @param parent the new parent - */ - public void setParent(AAIResource parent) { - this.parent = parent; - } - - /** - * Gets the children. - * - * @return the children - */ - public AAIResources getChildren() { - if (this.children == null) { - this.children = new AAIResources(); - } - return this.children; - } - - /** - * Gets the aai resource keys. - * - * @return the aai resource keys - */ - public AAIResourceKeys getAaiResourceKeys() { - if (aaiResourceKeys == null) { - aaiResourceKeys = new AAIResourceKeys(); - } - return aaiResourceKeys; - } - - /** - * Gets the namespace. - * - * @return the namespace - */ - public String getNamespace() { - return namespace; - } - - /** - * Sets the namespace. - * - * @param namespace the new namespace - */ - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - /** - * Gets the resource type. - * - * @return the resource type - */ - public String getResourceType() { - return resourceType; - } - - /** - * Sets the resource type. - * - * @param resourceType the new resource type - */ - public void setResourceType(String resourceType) { - this.resourceType = resourceType; - } - - /** - * Gets the simple name. - * - * @return the simple name - */ - public String getSimpleName() { - return simpleName; - } - - /** - * Sets the simple name. - * - * @param simpleName the new simple name - */ - public void setSimpleName(String simpleName) { - this.simpleName = simpleName; - } - - /** - * Gets the full name. - * - * @return the full name - */ - public String getFullName() { - return fullName; - } - - /** - * Sets the full name. - * - * @param fullName the new full name - */ - public void setFullName(String fullName) { - this.fullName = fullName; - } - - /** - * Gets the uri. - * - * @return the uri - */ - public String getUri() { - return uri; - } - - /** - * Sets the uri. - * - * @param uri the new uri - */ - public void setUri(String uri) { - this.uri = uri; - } - - /** - * Gets the resource class name. - * - * @return the resource class name - */ - public String getResourceClassName() { - return resourceClassName; - } - - /** - * Sets the resource class name. - * - * @param resourceClassName the new resource class name - */ - public void setResourceClassName(String resourceClassName) { - this.resourceClassName = resourceClassName; - } - - /** - * Gets the property data type map. - * - * @return the property data type map - */ - public Map getPropertyDataTypeMap() { - return PropertyDataTypeMap; - } - - /** - * Sets the property data type map. - * - * @param propertyDataTypeMap the property data type map - */ - public void setPropertyDataTypeMap(Map propertyDataTypeMap) { - PropertyDataTypeMap = propertyDataTypeMap; - } - - /** - * Gets the node map indexed props. - * - * @return the node map indexed props - */ - public Multimap getNodeMapIndexedProps() { - return NodeMapIndexedProps; - } - - /** - * Sets the node map indexed props. - * - * @param nodeMapIndexedProps the node map indexed props - */ - public void setNodeMapIndexedProps(Multimap nodeMapIndexedProps) { - NodeMapIndexedProps = nodeMapIndexedProps; - } - - /** - * Gets the node key props. - * - * @return the node key props - */ - public Multimap getNodeKeyProps() { - return NodeKeyProps; - } - - /** - * Sets the node key props. - * - * @param nodeKeyProps the node key props - */ - public void setNodeKeyProps(Multimap nodeKeyProps) { - this.NodeKeyProps = nodeKeyProps; - } - - /** - * Gets the node name props. - * - * @return the node name props - */ - public Multimap getNodeNameProps() { - return NodeNameProps; - } - - /** - * Sets the node name props. - * - * @param nodeNameProps the node name props - */ - public void setNodeNameProps(Multimap nodeNameProps) { - - NodeNameProps = nodeNameProps; - } - - /** - * Gets the node unique props. - * - * @return the node unique props - */ - public Multimap getNodeUniqueProps() { - return NodeUniqueProps; - } - - /** - * Sets the node unique props. - * - * @param nodeUniqueProps the node unique props - */ - public void setNodeUniqueProps(Multimap nodeUniqueProps) { - NodeUniqueProps = nodeUniqueProps; - } - - /** - * Gets the node req props. - * - * @return the node req props - */ - public Multimap getNodeReqProps() { - return NodeReqProps; - } - - /** - * Sets the node req props. - * - * @param nodeReqProps the node req props - */ - public void setNodeReqProps(Multimap nodeReqProps) { - NodeReqProps = nodeReqProps; - } - - /** - * Gets the api version. - * - * @return the api version - */ - public String getApiVersion() { - return apiVersion; - } - - /** - * Sets the api version. - * - * @param apiVersion the new api version - */ - public void setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - } - - /** - * Gets the relationship list class. - * - * @return the relationship list class - */ - public String getRelationshipListClass() { - return relationshipListClass; - } - - /** - * Sets the relationship list class. - * - * @param relationshipListClass the new relationship list class - */ - public void setRelationshipListClass(String relationshipListClass) { - this.relationshipListClass = relationshipListClass; - } - - /** - * Gets the relationship utils. - * - * @return the relationship utils - */ - public String getRelationshipUtils() { - return relationshipUtils; - } - - /** - * Sets the relationship utils. - * - * @param relationshipUtils the new relationship utils - */ - public void setRelationshipUtils(String relationshipUtils) { - this.relationshipUtils = relationshipUtils; - } - - /** - * Gets the string fields. - * - * @return the string fields - */ - public ArrayList getStringFields() { - if (this.stringFields == null) { - this.stringFields = new ArrayList(); - } - return this.stringFields; - } - - /** - * Sets the string fields. - * - * @param stringFields the new string fields - */ - public void setStringFields(ArrayList stringFields) { - this.stringFields = stringFields; - } - - /** - * Gets the string list fields. - * - * @return the string list fields - */ - public ArrayList getStringListFields() { - if (this.stringListFields == null) { - this.stringListFields = new ArrayList(); - } - return this.stringListFields; - } - - /** - * Sets the string list fields. - * - * @param stringListFields the new string list fields - */ - public void setStringListFields(ArrayList stringListFields) { - this.stringListFields = stringListFields; - } - - /** - * Gets the long fields. - * - * @return the long fields - */ - public ArrayList getLongFields() { - if (this.longFields == null) { - this.longFields = new ArrayList(); - } - return longFields; - } - - /** - * Sets the long fields. - * - * @param longFields the new long fields - */ - public void setLongFields(ArrayList longFields) { - this.longFields = longFields; - } - - /** - * Gets the int fields. - * - * @return the int fields - */ - public ArrayList getIntFields() { - if (this.intFields == null) { - this.intFields = new ArrayList(); - } - return intFields; - } - - /** - * Sets the int fields. - * - * @param intFields the new int fields - */ - public void setIntFields(ArrayList intFields) { - this.intFields = intFields; - } - - /** - * Gets the short fields. - * - * @return the short fields - */ - public ArrayList getShortFields() { - if (this.shortFields == null) { - this.shortFields = new ArrayList(); - } - return shortFields; - } - - /** - * Sets the short fields. - * - * @param shortFields the new short fields - */ - public void setShortFields(ArrayList shortFields) { - this.shortFields = shortFields; - } - - /** - * Gets the boolean fields. - * - * @return the boolean fields - */ - public ArrayList getBooleanFields() { - if (this.booleanFields == null) { - this.booleanFields = new ArrayList(); - } - return booleanFields; - } - - /** - * Sets the boolean fields. - * - * @param booleanFields the new boolean fields - */ - public void setBooleanFields(ArrayList booleanFields) { - this.booleanFields = booleanFields; - } - - /** - * Gets the required fields. - * - * @return the required fields - */ - public ArrayList getRequiredFields() { - if (this.requiredFields == null) { - this.requiredFields = new ArrayList(); - } - return requiredFields; - } - - /** - * Sets the required fields. - * - * @param requiredFields the new required fields - */ - public void setRequiredFields(ArrayList requiredFields) { - this.requiredFields = requiredFields; - } - - /** - * Gets the ordered fields. - * - * @return the ordered fields - */ - public ArrayList getOrderedFields() { - if (this.orderedFields == null) { - this.orderedFields = new ArrayList(); - } - return this.orderedFields; - } - - /** - * Gets the all fields. - * - * @return the all fields - */ - public ArrayList getAllFields() { - - ArrayList allFields = new ArrayList(); - allFields.addAll(getBooleanFields()); - allFields.addAll(getStringListFields()); - allFields.addAll(getStringFields()); - allFields.addAll(getIntFields()); - allFields.addAll(getLongFields()); - allFields.addAll(getShortFields()); - - return allFields; - } - - /** - * Gets the plural name. - * - * @return the plural name - */ - public String getPluralName() { - - if (simpleName.contains("List") || simpleName.contains("-list") ) - return ""; - String[] fullNameList = getFullName().split("/"); - return fullNameList[fullNameList.length - 2]; - } - - /** - * Sets the node alt key 1 props. - * - * @param _dbRulesNodeAltKey1Props the db rules node alt key 1 props - */ - public void setNodeAltKey1Props(Multimap _dbRulesNodeAltKey1Props) { - this.NodeAltKey1Props = _dbRulesNodeAltKey1Props; - } - - /** - * Gets the node alt key 1 props. - * - * @return the node alt key 1 props - */ - public Multimap getNodeAltKey1Props() { - return this.NodeAltKey1Props; - } - - /** - * Sets the node dependencies. - * - * @param _dbRulesNodeDependencies the db rules node dependencies - */ - public void setNodeDependencies(Multimap _dbRulesNodeDependencies) { - this.NodeDependencies = _dbRulesNodeDependencies; - } - - /** - * Gets the node dependencies. - * - * @return the node dependencies - */ - public Multimap getNodeDependencies() { - return this.NodeDependencies; - } - - /** - * Gets the recurse to resource. - * - * @return the recurse to resource - */ - public AAIResource getRecurseToResource() { - return this.recurseToResource; - } - - /** - * Sets the recurse to resource. - * - * @param ancestor the new recurse to resource - */ - public void setRecurseToResource(AAIResource ancestor) { - this.recurseToResource = ancestor; - - } - - /** - * Sets the allow direct write. - * - * @param allowDirectWrite the new allow direct write - */ - public void setAllowDirectWrite(boolean allowDirectWrite) { - this.allowDirectWrite = allowDirectWrite; - } - - /** - * Checks if is allow direct write. - * - * @return true, if is allow direct write - */ - public boolean isAllowDirectWrite() { - return this.allowDirectWrite; - } - - /** - * Sets the allow direct read. - * - * @param allowDirectRead the new allow direct read - */ - public void setAllowDirectRead(boolean allowDirectRead) { - this.allowDirectRead = allowDirectRead; - } - - /** - * Checks if is allow direct read. - * - * @return true, if is allow direct read - */ - public boolean isAllowDirectRead() { - return this.allowDirectRead; - } - - /** - * Gets the auto gen uuid fields. - * - * @return the auto gen uuid fields - */ - public ArrayList getAutoGenUuidFields() { - if (this.autoGenUuidFields == null) { - this.autoGenUuidFields = new ArrayList(); - } - return this.autoGenUuidFields; - } -} \ No newline at end of file + private AAIResource parent; + private AAIResources children; + + private AAIResourceKeys aaiResourceKeys; + + private String namespace; // /Network/Vces/Vce/PortGroups/PortGroup/CvlanTags/CvlanTag -> "Network" + + private String resourceType; // node or container + private String resourceClassName; + private String simpleName; // Vce + private String fullName; // /Network/Vces/Vce/PortGroups/PortGroup/CvlanTags/CvlanTag + private String uri; // /network/vces/vce/{vnf-id}/port-groups/port-group/{interface-name}/cvlan-tags/cvlan-tag/{cvlan-tag} + private String apiVersion; + private String relationshipListClass; + private String relationshipUtils; + + private Map PropertyDataTypeMap; + private Multimap NodeMapIndexedProps; + private Multimap NodeAltKey1Props; + private Multimap NodeDependencies; + private Multimap NodeKeyProps; + private Multimap NodeReqProps; + private Multimap NodeNameProps; + private Multimap NodeUniqueProps; + + // if new dataTypes are added - make sure to update getAllFields() method below + private ArrayList stringFields; + private ArrayList stringListFields; + private ArrayList longFields; + private ArrayList intFields; + private ArrayList shortFields; + private ArrayList booleanFields; + + private ArrayList requiredFields; + private ArrayList orderedFields; + private AAIResource recurseToResource; + private boolean allowDirectWrite; + private boolean allowDirectRead; + private ArrayList autoGenUuidFields; + + /** + * Gets the parent. + * + * @return the parent + */ + public AAIResource getParent() { + return parent; + } + + /** + * Sets the parent. + * + * @param parent the new parent + */ + public void setParent(AAIResource parent) { + this.parent = parent; + } + + /** + * Gets the children. + * + * @return the children + */ + public AAIResources getChildren() { + if (this.children == null) { + this.children = new AAIResources(); + } + return this.children; + } + + /** + * Gets the aai resource keys. + * + * @return the aai resource keys + */ + public AAIResourceKeys getAaiResourceKeys() { + if (aaiResourceKeys == null) { + aaiResourceKeys = new AAIResourceKeys(); + } + return aaiResourceKeys; + } + + /** + * Gets the namespace. + * + * @return the namespace + */ + public String getNamespace() { + return namespace; + } + + /** + * Sets the namespace. + * + * @param namespace the new namespace + */ + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + /** + * Gets the resource type. + * + * @return the resource type + */ + public String getResourceType() { + return resourceType; + } + + /** + * Sets the resource type. + * + * @param resourceType the new resource type + */ + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + /** + * Gets the simple name. + * + * @return the simple name + */ + public String getSimpleName() { + return simpleName; + } + + /** + * Sets the simple name. + * + * @param simpleName the new simple name + */ + public void setSimpleName(String simpleName) { + this.simpleName = simpleName; + } + + /** + * Gets the full name. + * + * @return the full name + */ + public String getFullName() { + return fullName; + } + + /** + * Sets the full name. + * + * @param fullName the new full name + */ + public void setFullName(String fullName) { + this.fullName = fullName; + } + + /** + * Gets the uri. + * + * @return the uri + */ + public String getUri() { + return uri; + } + + /** + * Sets the uri. + * + * @param uri the new uri + */ + public void setUri(String uri) { + this.uri = uri; + } + + /** + * Gets the resource class name. + * + * @return the resource class name + */ + public String getResourceClassName() { + return resourceClassName; + } + + /** + * Sets the resource class name. + * + * @param resourceClassName the new resource class name + */ + public void setResourceClassName(String resourceClassName) { + this.resourceClassName = resourceClassName; + } + + /** + * Gets the property data type map. + * + * @return the property data type map + */ + public Map getPropertyDataTypeMap() { + return PropertyDataTypeMap; + } + + /** + * Sets the property data type map. + * + * @param propertyDataTypeMap the property data type map + */ + public void setPropertyDataTypeMap(Map propertyDataTypeMap) { + PropertyDataTypeMap = propertyDataTypeMap; + } + + /** + * Gets the node map indexed props. + * + * @return the node map indexed props + */ + public Multimap getNodeMapIndexedProps() { + return NodeMapIndexedProps; + } + + /** + * Sets the node map indexed props. + * + * @param nodeMapIndexedProps the node map indexed props + */ + public void setNodeMapIndexedProps(Multimap nodeMapIndexedProps) { + NodeMapIndexedProps = nodeMapIndexedProps; + } + + /** + * Gets the node key props. + * + * @return the node key props + */ + public Multimap getNodeKeyProps() { + return NodeKeyProps; + } + + /** + * Sets the node key props. + * + * @param nodeKeyProps the node key props + */ + public void setNodeKeyProps(Multimap nodeKeyProps) { + this.NodeKeyProps = nodeKeyProps; + } + + /** + * Gets the node name props. + * + * @return the node name props + */ + public Multimap getNodeNameProps() { + return NodeNameProps; + } + + /** + * Sets the node name props. + * + * @param nodeNameProps the node name props + */ + public void setNodeNameProps(Multimap nodeNameProps) { + + NodeNameProps = nodeNameProps; + } + + /** + * Gets the node unique props. + * + * @return the node unique props + */ + public Multimap getNodeUniqueProps() { + return NodeUniqueProps; + } + + /** + * Sets the node unique props. + * + * @param nodeUniqueProps the node unique props + */ + public void setNodeUniqueProps(Multimap nodeUniqueProps) { + NodeUniqueProps = nodeUniqueProps; + } + + /** + * Gets the node req props. + * + * @return the node req props + */ + public Multimap getNodeReqProps() { + return NodeReqProps; + } + + /** + * Sets the node req props. + * + * @param nodeReqProps the node req props + */ + public void setNodeReqProps(Multimap nodeReqProps) { + NodeReqProps = nodeReqProps; + } + + /** + * Gets the api version. + * + * @return the api version + */ + public String getApiVersion() { + return apiVersion; + } + + /** + * Sets the api version. + * + * @param apiVersion the new api version + */ + public void setApiVersion(String apiVersion) { + this.apiVersion = apiVersion; + } + + /** + * Gets the relationship list class. + * + * @return the relationship list class + */ + public String getRelationshipListClass() { + return relationshipListClass; + } + + /** + * Sets the relationship list class. + * + * @param relationshipListClass the new relationship list class + */ + public void setRelationshipListClass(String relationshipListClass) { + this.relationshipListClass = relationshipListClass; + } + + /** + * Gets the relationship utils. + * + * @return the relationship utils + */ + public String getRelationshipUtils() { + return relationshipUtils; + } + + /** + * Sets the relationship utils. + * + * @param relationshipUtils the new relationship utils + */ + public void setRelationshipUtils(String relationshipUtils) { + this.relationshipUtils = relationshipUtils; + } + + /** + * Gets the string fields. + * + * @return the string fields + */ + public ArrayList getStringFields() { + if (this.stringFields == null) { + this.stringFields = new ArrayList(); + } + return this.stringFields; + } + + /** + * Sets the string fields. + * + * @param stringFields the new string fields + */ + public void setStringFields(ArrayList stringFields) { + this.stringFields = stringFields; + } + + /** + * Gets the string list fields. + * + * @return the string list fields + */ + public ArrayList getStringListFields() { + if (this.stringListFields == null) { + this.stringListFields = new ArrayList(); + } + return this.stringListFields; + } + + /** + * Sets the string list fields. + * + * @param stringListFields the new string list fields + */ + public void setStringListFields(ArrayList stringListFields) { + this.stringListFields = stringListFields; + } + + /** + * Gets the long fields. + * + * @return the long fields + */ + public ArrayList getLongFields() { + if (this.longFields == null) { + this.longFields = new ArrayList(); + } + return longFields; + } + + /** + * Sets the long fields. + * + * @param longFields the new long fields + */ + public void setLongFields(ArrayList longFields) { + this.longFields = longFields; + } + + /** + * Gets the int fields. + * + * @return the int fields + */ + public ArrayList getIntFields() { + if (this.intFields == null) { + this.intFields = new ArrayList(); + } + return intFields; + } + + /** + * Sets the int fields. + * + * @param intFields the new int fields + */ + public void setIntFields(ArrayList intFields) { + this.intFields = intFields; + } + + /** + * Gets the short fields. + * + * @return the short fields + */ + public ArrayList getShortFields() { + if (this.shortFields == null) { + this.shortFields = new ArrayList(); + } + return shortFields; + } + + /** + * Sets the short fields. + * + * @param shortFields the new short fields + */ + public void setShortFields(ArrayList shortFields) { + this.shortFields = shortFields; + } + + /** + * Gets the boolean fields. + * + * @return the boolean fields + */ + public ArrayList getBooleanFields() { + if (this.booleanFields == null) { + this.booleanFields = new ArrayList(); + } + return booleanFields; + } + + /** + * Sets the boolean fields. + * + * @param booleanFields the new boolean fields + */ + public void setBooleanFields(ArrayList booleanFields) { + this.booleanFields = booleanFields; + } + + /** + * Gets the required fields. + * + * @return the required fields + */ + public ArrayList getRequiredFields() { + if (this.requiredFields == null) { + this.requiredFields = new ArrayList(); + } + return requiredFields; + } + + /** + * Sets the required fields. + * + * @param requiredFields the new required fields + */ + public void setRequiredFields(ArrayList requiredFields) { + this.requiredFields = requiredFields; + } + + /** + * Gets the ordered fields. + * + * @return the ordered fields + */ + public ArrayList getOrderedFields() { + if (this.orderedFields == null) { + this.orderedFields = new ArrayList(); + } + return this.orderedFields; + } + + /** + * Gets the all fields. + * + * @return the all fields + */ + public ArrayList getAllFields() { + + ArrayList allFields = new ArrayList(); + allFields.addAll(getBooleanFields()); + allFields.addAll(getStringListFields()); + allFields.addAll(getStringFields()); + allFields.addAll(getIntFields()); + allFields.addAll(getLongFields()); + allFields.addAll(getShortFields()); + + return allFields; + } + + /** + * Gets the plural name. + * + * @return the plural name + */ + public String getPluralName() { + + if (simpleName.contains("List") || simpleName.contains("-list")) + return ""; + String[] fullNameList = getFullName().split("/"); + return fullNameList[fullNameList.length - 2]; + } + + /** + * Sets the node alt key 1 props. + * + * @param _dbRulesNodeAltKey1Props the db rules node alt key 1 props + */ + public void setNodeAltKey1Props(Multimap _dbRulesNodeAltKey1Props) { + this.NodeAltKey1Props = _dbRulesNodeAltKey1Props; + } + + /** + * Gets the node alt key 1 props. + * + * @return the node alt key 1 props + */ + public Multimap getNodeAltKey1Props() { + return this.NodeAltKey1Props; + } + + /** + * Sets the node dependencies. + * + * @param _dbRulesNodeDependencies the db rules node dependencies + */ + public void setNodeDependencies(Multimap _dbRulesNodeDependencies) { + this.NodeDependencies = _dbRulesNodeDependencies; + } + + /** + * Gets the node dependencies. + * + * @return the node dependencies + */ + public Multimap getNodeDependencies() { + return this.NodeDependencies; + } + + /** + * Gets the recurse to resource. + * + * @return the recurse to resource + */ + public AAIResource getRecurseToResource() { + return this.recurseToResource; + } + + /** + * Sets the recurse to resource. + * + * @param ancestor the new recurse to resource + */ + public void setRecurseToResource(AAIResource ancestor) { + this.recurseToResource = ancestor; + + } + + /** + * Sets the allow direct write. + * + * @param allowDirectWrite the new allow direct write + */ + public void setAllowDirectWrite(boolean allowDirectWrite) { + this.allowDirectWrite = allowDirectWrite; + } + + /** + * Checks if is allow direct write. + * + * @return true, if is allow direct write + */ + public boolean isAllowDirectWrite() { + return this.allowDirectWrite; + } + + /** + * Sets the allow direct read. + * + * @param allowDirectRead the new allow direct read + */ + public void setAllowDirectRead(boolean allowDirectRead) { + this.allowDirectRead = allowDirectRead; + } + + /** + * Checks if is allow direct read. + * + * @return true, if is allow direct read + */ + public boolean isAllowDirectRead() { + return this.allowDirectRead; + } + + /** + * Gets the auto gen uuid fields. + * + * @return the auto gen uuid fields + */ + public ArrayList getAutoGenUuidFields() { + if (this.autoGenUuidFields == null) { + this.autoGenUuidFields = new ArrayList(); + } + return this.autoGenUuidFields; + } +} diff --git a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKey.java b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKey.java index c85a17db..a61598f6 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKey.java +++ b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKey.java @@ -17,84 +17,85 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.model; public class AAIResourceKey { - private String keyName; - private String keyType; - private String pathParamName; - private String dnCamKeyName; - - /** - * Gets the key name. - * - * @return the key name - */ - public String getKeyName() { - return keyName; - } - - /** - * Sets the key name. - * - * @param keyName the new key name - */ - public void setKeyName(String keyName) { - this.keyName = keyName; - } - - /** - * Gets the key type. - * - * @return the key type - */ - public String getKeyType() { - return keyType; - } - - /** - * Sets the key type. - * - * @param t the new key type - */ - public void setKeyType(String t) { - this.keyType = t; - } - - /** - * Gets the path param name. - * - * @return the path param name - */ - public String getPathParamName() { - return pathParamName; - } - - /** - * Sets the path param name. - * - * @param pathParamName the new path param name - */ - public void setPathParamName(String pathParamName) { - this.pathParamName = pathParamName; - } - - /** - * Gets the dn cam key name. - * - * @return the dn cam key name - */ - public String getDnCamKeyName() { - return dnCamKeyName; - } - - /** - * Sets the dn cam key name. - * - * @param dnCamKeyName the new dn cam key name - */ - public void setDnCamKeyName(String dnCamKeyName) { - this.dnCamKeyName = dnCamKeyName; - } - + private String keyName; + private String keyType; + private String pathParamName; + private String dnCamKeyName; + + /** + * Gets the key name. + * + * @return the key name + */ + public String getKeyName() { + return keyName; + } + + /** + * Sets the key name. + * + * @param keyName the new key name + */ + public void setKeyName(String keyName) { + this.keyName = keyName; + } + + /** + * Gets the key type. + * + * @return the key type + */ + public String getKeyType() { + return keyType; + } + + /** + * Sets the key type. + * + * @param t the new key type + */ + public void setKeyType(String t) { + this.keyType = t; + } + + /** + * Gets the path param name. + * + * @return the path param name + */ + public String getPathParamName() { + return pathParamName; + } + + /** + * Sets the path param name. + * + * @param pathParamName the new path param name + */ + public void setPathParamName(String pathParamName) { + this.pathParamName = pathParamName; + } + + /** + * Gets the dn cam key name. + * + * @return the dn cam key name + */ + public String getDnCamKeyName() { + return dnCamKeyName; + } + + /** + * Sets the dn cam key name. + * + * @param dnCamKeyName the new dn cam key name + */ + public void setDnCamKeyName(String dnCamKeyName) { + this.dnCamKeyName = dnCamKeyName; + } + } diff --git a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKeys.java b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKeys.java index a863eb47..64149513 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKeys.java +++ b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResourceKeys.java @@ -17,23 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.model; import java.util.ArrayList; import java.util.List; public class AAIResourceKeys { - private List aaiResourceKey; + private List aaiResourceKey; - /** - * Gets the aai resource key. - * - * @return the aai resource key - */ - public List getAaiResourceKey() { - if (aaiResourceKey == null) { - aaiResourceKey = new ArrayList(); - } - return aaiResourceKey; - } + /** + * Gets the aai resource key. + * + * @return the aai resource key + */ + public List getAaiResourceKey() { + if (aaiResourceKey == null) { + aaiResourceKey = new ArrayList(); + } + return aaiResourceKey; + } } diff --git a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResources.java b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResources.java index 15a8852a..4e5f0392 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/model/AAIResources.java +++ b/aai-core/src/main/java/org/onap/aai/domain/model/AAIResources.java @@ -17,69 +17,69 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.domain.model; -import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; +package org.onap.aai.domain.model; import java.util.HashMap; +import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; + public class AAIResources { - - private DynamicJAXBContext jaxbContext; - - private HashMap aaiResources; - private HashMap resourceLookup; - - - /** - * Gets the aai resources. - * - * @return the aai resources - */ - public HashMap getAaiResources() { - if (aaiResources == null) { - aaiResources = new HashMap(); - } - return aaiResources; - } - /** - * Gets the jaxb context. - * - * @return the jaxb context - */ - public DynamicJAXBContext getJaxbContext() { - return jaxbContext; - } + private DynamicJAXBContext jaxbContext; + + private HashMap aaiResources; + private HashMap resourceLookup; + + /** + * Gets the aai resources. + * + * @return the aai resources + */ + public HashMap getAaiResources() { + if (aaiResources == null) { + aaiResources = new HashMap(); + } + return aaiResources; + } + + /** + * Gets the jaxb context. + * + * @return the jaxb context + */ + public DynamicJAXBContext getJaxbContext() { + return jaxbContext; + } + + /** + * Sets the jaxb context. + * + * @param jaxbContext the new jaxb context + */ + public void setJaxbContext(DynamicJAXBContext jaxbContext) { + this.jaxbContext = jaxbContext; + } - /** - * Sets the jaxb context. - * - * @param jaxbContext the new jaxb context - */ - public void setJaxbContext(DynamicJAXBContext jaxbContext) { - this.jaxbContext = jaxbContext; - } + /** + * Gets the resource lookup. + * + * @return the resource lookup + */ + public HashMap getResourceLookup() { + if (resourceLookup == null) { + resourceLookup = new HashMap(); + } + return resourceLookup; + } - /** - * Gets the resource lookup. - * - * @return the resource lookup - */ - public HashMap getResourceLookup() { - if (resourceLookup == null) { - resourceLookup = new HashMap(); - } - return resourceLookup; - } + /** + * Sets the resource lookup. + * + * @param resourceLookup the resource lookup + */ + public void setResourceLookup(HashMap resourceLookup) { + this.resourceLookup = resourceLookup; + } - /** - * Sets the resource lookup. - * - * @param resourceLookup the resource lookup - */ - public void setResourceLookup(HashMap resourceLookup) { - this.resourceLookup = resourceLookup; - } - -} \ No newline at end of file +} diff --git a/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/NotificationEvent.java b/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/NotificationEvent.java index dca48496..d8b9b997 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/NotificationEvent.java +++ b/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/NotificationEvent.java @@ -24,7 +24,6 @@ // Generated on: 2016.01.06 at 05:38:00 PM EST // - package org.onap.aai.domain.notificationEvent; import javax.xml.bind.annotation.XmlAccessType; @@ -33,13 +32,15 @@ import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; -import org.w3c.dom.Element; +import org.w3c.dom.Element; /** - *

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

  * <complexType>
@@ -80,16 +81,12 @@ import org.w3c.dom.Element;
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-	"cambriaPartition",
-    "eventHeader",
-    "entity"
-})
+@XmlType(name = "", propOrder = {"cambriaPartition", "eventHeader", "entity"})
 @XmlRootElement(name = "NotificationEvent")
 public class NotificationEvent {
 
-	@XmlElement(name = "cambria.partition")
-	protected String cambriaPartition;
+    @XmlElement(name = "cambria.partition")
+    protected String cambriaPartition;
     @XmlElement(name = "event-header")
     protected EventHeader eventHeader;
     @XmlAnyElement(lax = true)
@@ -99,9 +96,9 @@ public class NotificationEvent {
      * Gets the value of the eventHeader property.
      * 
      * @return
-     *     possible object is
-     *     {@link EventHeader }
-     *     
+     *         possible object is
+     *         {@link EventHeader }
+     * 
      */
     public EventHeader getEventHeader() {
         return eventHeader;
@@ -111,9 +108,9 @@ public class NotificationEvent {
      * Sets the value of the eventHeader property.
      * 
      * @param value
-     *     allowed object is
-     *     {@link EventHeader }
-     *     
+     *        allowed object is
+     *        {@link EventHeader }
+     * 
      */
     public void setEventHeader(EventHeader value) {
         this.eventHeader = value;
@@ -123,10 +120,10 @@ public class NotificationEvent {
      * Gets the value of the any property.
      * 
      * @return
-     *     possible object is
-     *     {@link Object }
-     *     {@link Element }
-     *     
+     *         possible object is
+     *         {@link Object }
+     *         {@link Element }
+     * 
      */
     public Object getEntity() {
         return entity;
@@ -136,10 +133,10 @@ public class NotificationEvent {
      * Sets the value of the any property.
      * 
      * @param value
-     *     allowed object is
-     *     {@link Object }
-     *     {@link Element }
-     *     
+     *        allowed object is
+     *        {@link Object }
+     *        {@link Element }
+     * 
      */
     public void setEntity(Object value) {
         this.entity = value;
@@ -149,9 +146,9 @@ public class NotificationEvent {
      * Gets the value of the cambriaPartition property.
      * 
      * @return
-     *     possible object is
-     *     {@link String }
-     *     
+     *         possible object is
+     *         {@link String }
+     * 
      */
     public String getCambriaPartition() {
         return cambriaPartition;
@@ -161,19 +158,20 @@ public class NotificationEvent {
      * Sets the value of the cambriaPartition property.
      * 
      * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
+     *        allowed object is
+     *        {@link String }
+     * 
      */
     public void setCambriaPartition(String value) {
         this.cambriaPartition = value;
     }
 
-
     /**
-     * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

      * <complexType>
@@ -202,21 +200,10 @@ public class NotificationEvent {
      * 
      */
     @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "id",
-        "timestamp",
-        "sourceName",
-        "domain",
-        "sequenceNumber",
-        "severity",
-        "eventType",
-        "version",
-        "action",
-        "entityType",
-        "topEntityType",
-        "entityLink",
-        "status"
-    })
+    @XmlType(
+            name = "",
+            propOrder = {"id", "timestamp", "sourceName", "domain", "sequenceNumber", "severity", "eventType",
+                    "version", "action", "entityType", "topEntityType", "entityLink", "status"})
     public static class EventHeader {
 
         @XmlElement(required = true)
@@ -250,9 +237,9 @@ public class NotificationEvent {
          * Gets the value of the id property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getId() {
             return id;
@@ -262,9 +249,9 @@ public class NotificationEvent {
          * Sets the value of the id property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setId(String value) {
             this.id = value;
@@ -274,9 +261,9 @@ public class NotificationEvent {
          * Gets the value of the timestamp property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getTimestamp() {
             return timestamp;
@@ -286,9 +273,9 @@ public class NotificationEvent {
          * Sets the value of the timestamp property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setTimestamp(String value) {
             this.timestamp = value;
@@ -298,9 +285,9 @@ public class NotificationEvent {
          * Gets the value of the sourceName property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getSourceName() {
             return sourceName;
@@ -310,9 +297,9 @@ public class NotificationEvent {
          * Sets the value of the sourceName property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setSourceName(String value) {
             this.sourceName = value;
@@ -322,9 +309,9 @@ public class NotificationEvent {
          * Gets the value of the domain property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getDomain() {
             return domain;
@@ -334,9 +321,9 @@ public class NotificationEvent {
          * Sets the value of the domain property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setDomain(String value) {
             this.domain = value;
@@ -346,9 +333,9 @@ public class NotificationEvent {
          * Gets the value of the sequenceNumber property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getSequenceNumber() {
             return sequenceNumber;
@@ -358,9 +345,9 @@ public class NotificationEvent {
          * Sets the value of the sequenceNumber property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setSequenceNumber(String value) {
             this.sequenceNumber = value;
@@ -370,9 +357,9 @@ public class NotificationEvent {
          * Gets the value of the severity property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getSeverity() {
             return severity;
@@ -382,9 +369,9 @@ public class NotificationEvent {
          * Sets the value of the severity property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setSeverity(String value) {
             this.severity = value;
@@ -394,9 +381,9 @@ public class NotificationEvent {
          * Gets the value of the eventType property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getEventType() {
             return eventType;
@@ -406,9 +393,9 @@ public class NotificationEvent {
          * Sets the value of the eventType property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setEventType(String value) {
             this.eventType = value;
@@ -418,9 +405,9 @@ public class NotificationEvent {
          * Gets the value of the version property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getVersion() {
             return version;
@@ -430,9 +417,9 @@ public class NotificationEvent {
          * Sets the value of the version property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setVersion(String value) {
             this.version = value;
@@ -442,9 +429,9 @@ public class NotificationEvent {
          * Gets the value of the action property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getAction() {
             return action;
@@ -454,9 +441,9 @@ public class NotificationEvent {
          * Sets the value of the action property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setAction(String value) {
             this.action = value;
@@ -466,9 +453,9 @@ public class NotificationEvent {
          * Gets the value of the entityType property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getEntityType() {
             return entityType;
@@ -478,9 +465,9 @@ public class NotificationEvent {
          * Sets the value of the entityType property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setEntityType(String value) {
             this.entityType = value;
@@ -490,9 +477,9 @@ public class NotificationEvent {
          * Gets the value of the topEntityType property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getTopEntityType() {
             return topEntityType;
@@ -502,9 +489,9 @@ public class NotificationEvent {
          * Sets the value of the topEntityType property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setTopEntityType(String value) {
             this.topEntityType = value;
@@ -514,9 +501,9 @@ public class NotificationEvent {
          * Gets the value of the entityLink property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getEntityLink() {
             return entityLink;
@@ -526,9 +513,9 @@ public class NotificationEvent {
          * Sets the value of the entityLink property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setEntityLink(String value) {
             this.entityLink = value;
@@ -538,9 +525,9 @@ public class NotificationEvent {
          * Gets the value of the status property.
          * 
          * @return
-         *     possible object is
-         *     {@link String }
-         *     
+         *         possible object is
+         *         {@link String }
+         * 
          */
         public String getStatus() {
             return status;
@@ -550,9 +537,9 @@ public class NotificationEvent {
          * Sets the value of the status property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
+         *        allowed object is
+         *        {@link String }
+         * 
          */
         public void setStatus(String value) {
             this.status = value;
diff --git a/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/ObjectFactory.java b/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/ObjectFactory.java
index 84f1920e..84f720d0 100644
--- a/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/ObjectFactory.java
+++ b/aai-core/src/main/java/org/onap/aai/domain/notificationEvent/ObjectFactory.java
@@ -24,32 +24,31 @@
 // Generated on: 2016.01.06 at 05:38:00 PM EST 
 //
 
-
 package org.onap.aai.domain.notificationEvent;
 
 import javax.xml.bind.annotation.XmlRegistry;
 
-
 /**
- * This object contains factory methods for each 
- * Java content interface and Java element interface 
- * generated in the org.onap.aai.domain.notificationEvent package. 
- * 

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the org.onap.aai.domain.notificationEvent package. + *

+ * An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.onap.aai.domain.notificationEvent + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: + * org.onap.aai.domain.notificationEvent * */ public ObjectFactory() { diff --git a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessage.java b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessage.java index 490666c4..6cd82eef 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessage.java +++ b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessage.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.responseMessage; import javax.xml.bind.annotation.XmlAccessType; @@ -26,12 +27,10 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "aaiResponseMessageCode", - "aaiResponseMessageResourceType", - "aaiResponseMessageDescription", - "aaiResponseMessageData", -}) +@XmlType( + name = "", + propOrder = {"aaiResponseMessageCode", "aaiResponseMessageResourceType", "aaiResponseMessageDescription", + "aaiResponseMessageData",}) @XmlRootElement(name = "aai-response-message", namespace = "http://org.onap.aai.inventory") public class AAIResponseMessage { @@ -43,82 +42,79 @@ public class AAIResponseMessage { protected String aaiResponseMessageDescription; @XmlElement(name = "aai-response-message-data") protected AAIResponseMessageData aaiResponseMessageData; - - /** - * Gets the aai response message code. - * - * @return the aai response message code - */ - public String getAaiResponseMessageCode() { - return aaiResponseMessageCode; - } - - /** - * Sets the aai response message code. - * - * @param aaiResponseMessageCode the new aai response message code - */ - public void setAaiResponseMessageCode(String aaiResponseMessageCode) { - this.aaiResponseMessageCode = aaiResponseMessageCode; - } - - /** - * Gets the aai response message resource type. - * - * @return the aai response message resource type - */ - public String getAaiResponseMessageResourceType() { - return aaiResponseMessageResourceType; - } - - /** - * Sets the aai response message resource type. - * - * @param aaiResponseMessageResourceType the new aai response message resource type - */ - public void setAaiResponseMessageResourceType( - String aaiResponseMessageResourceType) { - this.aaiResponseMessageResourceType = aaiResponseMessageResourceType; - } - - /** - * Gets the aai response message description. - * - * @return the aai response message description - */ - public String getAaiResponseMessageDescription() { - return aaiResponseMessageDescription; - } - - /** - * Sets the aai response message description. - * - * @param aaiResponseMessageDescription the new aai response message description - */ - public void setAaiResponseMessageDescription( - String aaiResponseMessageDescription) { - this.aaiResponseMessageDescription = aaiResponseMessageDescription; - } - - /** - * Gets the aai response message data. - * - * @return the aai response message data - */ - public AAIResponseMessageData getAaiResponseMessageData() { - if (aaiResponseMessageData == null) { - aaiResponseMessageData = new AAIResponseMessageData(); - } - return aaiResponseMessageData; - } - - /** - * Sets the AAI response message data. - * - * @param aaiResponseMessageData the new AAI response message data - */ - public void setAAIResponseMessageData( - AAIResponseMessageData aaiResponseMessageData) { - this.aaiResponseMessageData = aaiResponseMessageData; - } + + /** + * Gets the aai response message code. + * + * @return the aai response message code + */ + public String getAaiResponseMessageCode() { + return aaiResponseMessageCode; + } + + /** + * Sets the aai response message code. + * + * @param aaiResponseMessageCode the new aai response message code + */ + public void setAaiResponseMessageCode(String aaiResponseMessageCode) { + this.aaiResponseMessageCode = aaiResponseMessageCode; + } + + /** + * Gets the aai response message resource type. + * + * @return the aai response message resource type + */ + public String getAaiResponseMessageResourceType() { + return aaiResponseMessageResourceType; + } + + /** + * Sets the aai response message resource type. + * + * @param aaiResponseMessageResourceType the new aai response message resource type + */ + public void setAaiResponseMessageResourceType(String aaiResponseMessageResourceType) { + this.aaiResponseMessageResourceType = aaiResponseMessageResourceType; + } + + /** + * Gets the aai response message description. + * + * @return the aai response message description + */ + public String getAaiResponseMessageDescription() { + return aaiResponseMessageDescription; + } + + /** + * Sets the aai response message description. + * + * @param aaiResponseMessageDescription the new aai response message description + */ + public void setAaiResponseMessageDescription(String aaiResponseMessageDescription) { + this.aaiResponseMessageDescription = aaiResponseMessageDescription; + } + + /** + * Gets the aai response message data. + * + * @return the aai response message data + */ + public AAIResponseMessageData getAaiResponseMessageData() { + if (aaiResponseMessageData == null) { + aaiResponseMessageData = new AAIResponseMessageData(); + } + return aaiResponseMessageData; + } + + /** + * Sets the AAI response message data. + * + * @param aaiResponseMessageData the new AAI response message data + */ + public void setAAIResponseMessageData(AAIResponseMessageData aaiResponseMessageData) { + this.aaiResponseMessageData = aaiResponseMessageData; + } } diff --git a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageData.java b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageData.java index 1f40906f..76b73642 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageData.java +++ b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageData.java @@ -19,8 +19,8 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.domain.responseMessage; +package org.onap.aai.domain.responseMessage; // //This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 @@ -40,10 +40,7 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "aaiResponseMessageDatum", - "any" -}) +@XmlType(name = "", propOrder = {"aaiResponseMessageDatum", "any"}) @XmlRootElement(name = "aai-response-message-data", namespace = "http://org.onap.aai.inventory") public class AAIResponseMessageData { diff --git a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageDatum.java b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageDatum.java index 00ed166d..90c6e280 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageDatum.java +++ b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessageDatum.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.responseMessage; import javax.xml.bind.annotation.XmlAccessType; @@ -26,9 +27,7 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "aaiResponseMessageDatumKey", - "aaiResponseMessageDatumValue", +@XmlType(name = "", propOrder = {"aaiResponseMessageDatumKey", "aaiResponseMessageDatumValue", }) @@ -39,42 +38,41 @@ public class AAIResponseMessageDatum { protected String aaiResponseMessageDatumKey; @XmlElement(name = "aai-response-message-datum-value", required = true) protected String aaiResponseMessageDatumValue; - - /** - * Gets the aai response message datum key. - * - * @return the aai response message datum key - */ - public String getAaiResponseMessageDatumKey() { - return aaiResponseMessageDatumKey; - } - - /** - * Sets the aai response message datum key. - * - * @param aaiResponseMessageDatumKey the new aai response message datum key - */ - public void setAaiResponseMessageDatumKey(String aaiResponseMessageDatumKey) { - this.aaiResponseMessageDatumKey = aaiResponseMessageDatumKey; - } - - /** - * Gets the aai response message datum value. - * - * @return the aai response message datum value - */ - public String getAaiResponseMessageDatumValue() { - return aaiResponseMessageDatumValue; - } - - /** - * Sets the aai response message datum value. - * - * @param aaiResponseMessageDatumValue the new aai response message datum value - */ - public void setAaiResponseMessageDatumValue(String aaiResponseMessageDatumValue) { - this.aaiResponseMessageDatumValue = aaiResponseMessageDatumValue; - } - - + + /** + * Gets the aai response message datum key. + * + * @return the aai response message datum key + */ + public String getAaiResponseMessageDatumKey() { + return aaiResponseMessageDatumKey; + } + + /** + * Sets the aai response message datum key. + * + * @param aaiResponseMessageDatumKey the new aai response message datum key + */ + public void setAaiResponseMessageDatumKey(String aaiResponseMessageDatumKey) { + this.aaiResponseMessageDatumKey = aaiResponseMessageDatumKey; + } + + /** + * Gets the aai response message datum value. + * + * @return the aai response message datum value + */ + public String getAaiResponseMessageDatumValue() { + return aaiResponseMessageDatumValue; + } + + /** + * Sets the aai response message datum value. + * + * @param aaiResponseMessageDatumValue the new aai response message datum value + */ + public void setAaiResponseMessageDatumValue(String aaiResponseMessageDatumValue) { + this.aaiResponseMessageDatumValue = aaiResponseMessageDatumValue; + } + } diff --git a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessages.java b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessages.java index d4ea5651..09bf30e3 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessages.java +++ b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/AAIResponseMessages.java @@ -17,8 +17,8 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.domain.responseMessage; +package org.onap.aai.domain.responseMessage; // //This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 @@ -38,9 +38,11 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** - *

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

  * <complexType>
@@ -79,39 +81,36 @@ import javax.xml.bind.annotation.XmlType;
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-		"aaiResponseMessage",
-		"any"
-})
+@XmlType(name = "", propOrder = {"aaiResponseMessage", "any"})
 @XmlRootElement(name = "aai-response-messages", namespace = "http://org.onap.aai.inventory")
 public class AAIResponseMessages {
-	@XmlElement(name = "aai-response-message")
-	protected List aaiResponseMessage;
-	@XmlAnyElement(lax = true)
-	protected List any;
+    @XmlElement(name = "aai-response-message")
+    protected List aaiResponseMessage;
+    @XmlAnyElement(lax = true)
+    protected List any;
 
-	/**
-	 * Gets the AAI response message.
-	 *
-	 * @return the AAI response message
-	 */
-	public List getAAIResponseMessage() {
-		if (aaiResponseMessage == null) {
-			aaiResponseMessage = new ArrayList();
-		}
-		return this.aaiResponseMessage;
-	}
+    /**
+     * Gets the AAI response message.
+     *
+     * @return the AAI response message
+     */
+    public List getAAIResponseMessage() {
+        if (aaiResponseMessage == null) {
+            aaiResponseMessage = new ArrayList();
+        }
+        return this.aaiResponseMessage;
+    }
 
-	/**
-	 * Gets the any.
-	 *
-	 * @return the any
-	 */
-	public List getAny() {
-		if (any == null) {
-			any = new ArrayList();
-		}
-		return this.any;
-	}
+    /**
+     * Gets the any.
+     *
+     * @return the any
+     */
+    public List getAny() {
+        if (any == null) {
+            any = new ArrayList();
+        }
+        return this.any;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/package-info.java b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/package-info.java
index e305196d..7c4dd4df 100644
--- a/aai-core/src/main/java/org/onap/aai/domain/responseMessage/package-info.java
+++ b/aai-core/src/main/java/org/onap/aai/domain/responseMessage/package-info.java
@@ -8,7 +8,7 @@
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *    http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,14 +18,13 @@
  * ============LICENSE_END=========================================================
  */
 //
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
-// See http://java.sun.com/xml/jaxb 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2015.06.15 at 03:03:58 PM EDT 
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
+// See http://java.sun.com/xml/jaxb
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2015.06.15 at 03:03:58 PM EDT
 //
 
 @javax.xml.bind.annotation.XmlSchema(
-		namespace = "http://org.onap.aai.inventory", 
-		elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+        namespace = "http://org.onap.aai.inventory",
+        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
 package org.onap.aai.domain.responseMessage;
-
diff --git a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/Fault.java b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/Fault.java
index 69856873..55e45b64 100644
--- a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/Fault.java
+++ b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/Fault.java
@@ -24,22 +24,23 @@
 // Generated on: 2015.02.11 at 04:54:39 PM EST 
 //
 
-
 package org.onap.aai.domain.restPolicyException;
 
 import java.util.ArrayList;
 import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-
 /**
- * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

  * <complexType>
@@ -88,9 +89,7 @@ import javax.xml.bind.annotation.XmlType;
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-    "requestError"
-})
+@XmlType(name = "", propOrder = {"requestError"})
 @XmlRootElement(name = "Fault")
 public class Fault {
 
@@ -101,9 +100,9 @@ public class Fault {
      * Gets the value of the requestError property.
      * 
      * @return
-     *     possible object is
-     *     {@link RequestError }
-     *     
+     *         possible object is
+     *         {@link RequestError }
+     * 
      */
     public RequestError getRequestError() {
         return requestError;
@@ -113,19 +112,20 @@ public class Fault {
      * Sets the value of the requestError property.
      * 
      * @param value
-     *     allowed object is
-     *     {@link RequestError }
-     *     
+     *        allowed object is
+     *        {@link RequestError }
+     * 
      */
     public void setRequestError(RequestError value) {
         this.requestError = value;
     }
 
-
     /**
-     * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

      * <complexType>
@@ -164,9 +164,7 @@ public class Fault {
      * 
      */
     @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "policyException"
-    })
+    @XmlType(name = "", propOrder = {"policyException"})
     public static class RequestError {
 
         @XmlElement(required = true)
@@ -176,9 +174,9 @@ public class Fault {
          * Gets the value of the policyException property.
          * 
          * @return
-         *     possible object is
-         *     {@link PolicyException }
-         *     
+         *         possible object is
+         *         {@link PolicyException }
+         * 
          */
         public PolicyException getPolicyException() {
             return policyException;
@@ -188,19 +186,20 @@ public class Fault {
          * Sets the value of the policyException property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link PolicyException }
-         *     
+         *        allowed object is
+         *        {@link PolicyException }
+         * 
          */
         public void setPolicyException(PolicyException value) {
             this.policyException = value;
         }
 
-
         /**
-         * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

          * <complexType>
@@ -229,11 +228,7 @@ public class Fault {
          * 
          */
         @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "", propOrder = {
-            "messageId",
-            "text",
-            "variables"
-        })
+        @XmlType(name = "", propOrder = {"messageId", "text", "variables"})
         public static class PolicyException {
 
             @XmlElement(required = true)
@@ -247,9 +242,9 @@ public class Fault {
              * Gets the value of the messageId property.
              * 
              * @return
-             *     possible object is
-             *     {@link String }
-             *     
+             *         possible object is
+             *         {@link String }
+             * 
              */
             public String getMessageId() {
                 return messageId;
@@ -259,9 +254,9 @@ public class Fault {
              * Sets the value of the messageId property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
+             *        allowed object is
+             *        {@link String }
+             * 
              */
             public void setMessageId(String value) {
                 this.messageId = value;
@@ -271,9 +266,9 @@ public class Fault {
              * Gets the value of the text property.
              * 
              * @return
-             *     possible object is
-             *     {@link String }
-             *     
+             *         possible object is
+             *         {@link String }
+             * 
              */
             public String getText() {
                 return text;
@@ -283,9 +278,9 @@ public class Fault {
              * Sets the value of the text property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
+             *        allowed object is
+             *        {@link String }
+             * 
              */
             public void setText(String value) {
                 this.text = value;
@@ -295,9 +290,9 @@ public class Fault {
              * Gets the value of the variables property.
              * 
              * @return
-             *     possible object is
-             *     {@link Variables }
-             *     
+             *         possible object is
+             *         {@link Variables }
+             * 
              */
             public Variables getVariables() {
                 return variables;
@@ -307,19 +302,20 @@ public class Fault {
              * Sets the value of the variables property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link Variables }
-             *     
+             *        allowed object is
+             *        {@link Variables }
+             * 
              */
             public void setVariables(Variables value) {
                 this.variables = value;
             }
 
-
             /**
-             * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

              * <complexType>
@@ -336,9 +332,7 @@ public class Fault {
              * 
              */
             @XmlAccessorType(XmlAccessType.FIELD)
-            @XmlType(name = "", propOrder = {
-                "variable"
-            })
+            @XmlType(name = "", propOrder = {"variable"})
             public static class Variables {
 
                 protected List variable;
@@ -354,8 +348,9 @@ public class Fault {
                  * 
                  * 

* For example, to add a new item, do as follows: + * *

-                 *    getVariable().add(newItem);
+                 * getVariable().add(newItem);
                  * 
* * diff --git a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/ObjectFactory.java b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/ObjectFactory.java index 1cde4876..f85fe748 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/ObjectFactory.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/ObjectFactory.java @@ -24,32 +24,31 @@ // Generated on: 2015.02.11 at 04:54:39 PM EST // - package org.onap.aai.domain.restPolicyException; import javax.xml.bind.annotation.XmlRegistry; - /** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the org.onap.aai.domain.restPolicyException package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the org.onap.aai.domain.restPolicyException package. + *

+ * An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.onap.aai.domain.restPolicyException + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: + * org.onap.aai.domain.restPolicyException * */ public ObjectFactory() { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/PolicyException.java b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/PolicyException.java index b6e0d2e3..1aa2673a 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/PolicyException.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/PolicyException.java @@ -17,13 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.restPolicyException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -31,13 +27,16 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "messageId", - "text", - "variables" -}) +@JsonPropertyOrder({"messageId", "text", "variables"}) public class PolicyException { @JsonProperty("messageId") @@ -52,7 +51,7 @@ public class PolicyException { /** * Gets the message id. * - * @return The messageId + * @return The messageId */ @JsonProperty("messageId") public String getMessageId() { @@ -62,7 +61,7 @@ public class PolicyException { /** * Sets the message id. * - * @param messageId The messageId + * @param messageId The messageId */ @JsonProperty("messageId") public void setMessageId(String messageId) { @@ -72,7 +71,7 @@ public class PolicyException { /** * Gets the text. * - * @return The text + * @return The text */ @JsonProperty("text") public String getText() { @@ -82,7 +81,7 @@ public class PolicyException { /** * Sets the text. * - * @param text The text + * @param text The text */ @JsonProperty("text") public void setText(String text) { @@ -92,7 +91,7 @@ public class PolicyException { /** * Gets the variables. * - * @return The variables + * @return The variables */ @JsonProperty("variables") public List getVariables() { @@ -102,7 +101,7 @@ public class PolicyException { /** * Sets the variables. * - * @param variables The variables + * @param variables The variables */ @JsonProperty("variables") public void setVariables(List variables) { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RESTResponse.java b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RESTResponse.java index e6f98bc7..262ca855 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RESTResponse.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RESTResponse.java @@ -17,11 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.restPolicyException; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -29,11 +27,14 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "requestError" -}) +@JsonPropertyOrder({"requestError"}) public class RESTResponse { @JsonProperty("requestError") @@ -44,7 +45,7 @@ public class RESTResponse { /** * Gets the request error. * - * @return The requestError + * @return The requestError */ @JsonProperty("requestError") public RequestError getRequestError() { @@ -54,7 +55,7 @@ public class RESTResponse { /** * Sets the request error. * - * @param requestError The requestError + * @param requestError The requestError */ @JsonProperty("requestError") public void setRequestError(RequestError requestError) { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RequestError.java b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RequestError.java index 36245165..54580de7 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RequestError.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restPolicyException/RequestError.java @@ -17,11 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.restPolicyException; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -29,11 +27,14 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "policyException" -}) +@JsonPropertyOrder({"policyException"}) public class RequestError { @JsonProperty("policyException") @@ -44,7 +45,7 @@ public class RequestError { /** * Gets the policy exception. * - * @return The policyException + * @return The policyException */ @JsonProperty("policyException") public PolicyException getPolicyException() { @@ -54,7 +55,7 @@ public class RequestError { /** * Sets the policy exception. * - * @param policyException The policyException + * @param policyException The policyException */ @JsonProperty("policyException") public void setPolicyException(PolicyException policyException) { @@ -83,4 +84,3 @@ public class RequestError { } } - diff --git a/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/Info.java b/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/Info.java index 49d6190e..789fe926 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/Info.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/Info.java @@ -24,22 +24,23 @@ // Generated on: 2015.10.28 at 05:53:17 PM EDT // - package org.onap.aai.domain.restResponseInfo; import java.util.ArrayList; import java.util.List; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; - /** - *

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

  * <complexType>
@@ -88,9 +89,7 @@ import javax.xml.bind.annotation.XmlType;
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-    "responseMessages"
-})
+@XmlType(name = "", propOrder = {"responseMessages"})
 @XmlRootElement(name = "Info")
 public class Info {
 
@@ -100,9 +99,9 @@ public class Info {
      * Gets the value of the responseMessages property.
      * 
      * @return
-     *     possible object is
-     *     {@link ResponseMessages }
-     *     
+     *         possible object is
+     *         {@link ResponseMessages }
+     * 
      */
     public ResponseMessages getResponseMessages() {
         return responseMessages;
@@ -112,19 +111,20 @@ public class Info {
      * Sets the value of the responseMessages property.
      * 
      * @param value
-     *     allowed object is
-     *     {@link ResponseMessages }
-     *     
+     *        allowed object is
+     *        {@link ResponseMessages }
+     * 
      */
     public void setResponseMessages(ResponseMessages value) {
         this.responseMessages = value;
     }
 
-
     /**
-     * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

      * <complexType>
@@ -163,9 +163,7 @@ public class Info {
      * 
      */
     @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "responseMessage"
-    })
+    @XmlType(name = "", propOrder = {"responseMessage"})
     public static class ResponseMessages {
 
         protected List responseMessage;
@@ -181,8 +179,9 @@ public class Info {
          * 
          * 

* For example, to add a new item, do as follows: + * *

-         *    getResponseMessage().add(newItem);
+         * getResponseMessage().add(newItem);
          * 
* * @@ -199,11 +198,12 @@ public class Info { return this.responseMessage; } - /** - *

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

          * <complexType>
@@ -232,11 +232,7 @@ public class Info {
          * 
          */
         @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "", propOrder = {
-            "messageId",
-            "text",
-            "variables"
-        })
+        @XmlType(name = "", propOrder = {"messageId", "text", "variables"})
         public static class ResponseMessage {
 
             @XmlElement(required = true)
@@ -250,9 +246,9 @@ public class Info {
              * Gets the value of the messageId property.
              * 
              * @return
-             *     possible object is
-             *     {@link String }
-             *     
+             *         possible object is
+             *         {@link String }
+             * 
              */
             public String getMessageId() {
                 return messageId;
@@ -262,9 +258,9 @@ public class Info {
              * Sets the value of the messageId property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
+             *        allowed object is
+             *        {@link String }
+             * 
              */
             public void setMessageId(String value) {
                 this.messageId = value;
@@ -274,9 +270,9 @@ public class Info {
              * Gets the value of the text property.
              * 
              * @return
-             *     possible object is
-             *     {@link String }
-             *     
+             *         possible object is
+             *         {@link String }
+             * 
              */
             public String getText() {
                 return text;
@@ -286,9 +282,9 @@ public class Info {
              * Sets the value of the text property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
+             *        allowed object is
+             *        {@link String }
+             * 
              */
             public void setText(String value) {
                 this.text = value;
@@ -298,9 +294,9 @@ public class Info {
              * Gets the value of the variables property.
              * 
              * @return
-             *     possible object is
-             *     {@link Variables }
-             *     
+             *         possible object is
+             *         {@link Variables }
+             * 
              */
             public Variables getVariables() {
                 return variables;
@@ -310,19 +306,20 @@ public class Info {
              * Sets the value of the variables property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link Variables }
-             *     
+             *        allowed object is
+             *        {@link Variables }
+             * 
              */
             public void setVariables(Variables value) {
                 this.variables = value;
             }
 
-
             /**
-             * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

              * <complexType>
@@ -339,9 +336,7 @@ public class Info {
              * 
              */
             @XmlAccessorType(XmlAccessType.FIELD)
-            @XmlType(name = "", propOrder = {
-                "variable"
-            })
+            @XmlType(name = "", propOrder = {"variable"})
             public static class Variables {
 
                 protected List variable;
@@ -357,8 +352,9 @@ public class Info {
                  * 
                  * 

* For example, to add a new item, do as follows: + * *

-                 *    getVariable().add(newItem);
+                 * getVariable().add(newItem);
                  * 
* * diff --git a/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/ObjectFactory.java b/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/ObjectFactory.java index 6d6ddd0b..4efafb23 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/ObjectFactory.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restResponseInfo/ObjectFactory.java @@ -24,32 +24,31 @@ // Generated on: 2015.10.28 at 05:53:17 PM EDT // - package org.onap.aai.domain.restResponseInfo; import javax.xml.bind.annotation.XmlRegistry; - /** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the org.onap.aai.domain.restResponseInfo package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the org.onap.aai.domain.restResponseInfo package. + *

+ * An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.onap.aai.domain.restResponseInfo + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: + * org.onap.aai.domain.restResponseInfo * */ public ObjectFactory() { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/Fault.java b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/Fault.java index dd0df4f0..3efa13c3 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/Fault.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/Fault.java @@ -24,22 +24,23 @@ // Generated on: 2015.02.11 at 04:54:29 PM EST // - package org.onap.aai.domain.restServiceException; import java.util.ArrayList; import java.util.List; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; - /** - *

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

  * <complexType>
@@ -88,9 +89,7 @@ import javax.xml.bind.annotation.XmlType;
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-    "requestError"
-})
+@XmlType(name = "", propOrder = {"requestError"})
 @XmlRootElement(name = "Fault")
 public class Fault {
 
@@ -101,9 +100,9 @@ public class Fault {
      * Gets the value of the requestError property.
      * 
      * @return
-     *     possible object is
-     *     {@link RequestError }
-     *     
+     *         possible object is
+     *         {@link RequestError }
+     * 
      */
     public RequestError getRequestError() {
         return requestError;
@@ -113,19 +112,20 @@ public class Fault {
      * Sets the value of the requestError property.
      * 
      * @param value
-     *     allowed object is
-     *     {@link RequestError }
-     *     
+     *        allowed object is
+     *        {@link RequestError }
+     * 
      */
     public void setRequestError(RequestError value) {
         this.requestError = value;
     }
 
-
     /**
-     * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

      * <complexType>
@@ -164,9 +164,7 @@ public class Fault {
      * 
      */
     @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "serviceException"
-    })
+    @XmlType(name = "", propOrder = {"serviceException"})
     public static class RequestError {
 
         @XmlElement(required = true)
@@ -176,9 +174,9 @@ public class Fault {
          * Gets the value of the serviceException property.
          * 
          * @return
-         *     possible object is
-         *     {@link ServiceException }
-         *     
+         *         possible object is
+         *         {@link ServiceException }
+         * 
          */
         public ServiceException getServiceException() {
             return serviceException;
@@ -188,19 +186,20 @@ public class Fault {
          * Sets the value of the serviceException property.
          * 
          * @param value
-         *     allowed object is
-         *     {@link ServiceException }
-         *     
+         *        allowed object is
+         *        {@link ServiceException }
+         * 
          */
         public void setServiceException(ServiceException value) {
             this.serviceException = value;
         }
 
-
         /**
-         * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

          * <complexType>
@@ -229,11 +228,7 @@ public class Fault {
          * 
          */
         @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "", propOrder = {
-            "messageId",
-            "text",
-            "variables"
-        })
+        @XmlType(name = "", propOrder = {"messageId", "text", "variables"})
         public static class ServiceException {
 
             @XmlElement(required = true)
@@ -247,9 +242,9 @@ public class Fault {
              * Gets the value of the messageId property.
              * 
              * @return
-             *     possible object is
-             *     {@link String }
-             *     
+             *         possible object is
+             *         {@link String }
+             * 
              */
             public String getMessageId() {
                 return messageId;
@@ -259,9 +254,9 @@ public class Fault {
              * Sets the value of the messageId property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
+             *        allowed object is
+             *        {@link String }
+             * 
              */
             public void setMessageId(String value) {
                 this.messageId = value;
@@ -271,9 +266,9 @@ public class Fault {
              * Gets the value of the text property.
              * 
              * @return
-             *     possible object is
-             *     {@link String }
-             *     
+             *         possible object is
+             *         {@link String }
+             * 
              */
             public String getText() {
                 return text;
@@ -283,9 +278,9 @@ public class Fault {
              * Sets the value of the text property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
+             *        allowed object is
+             *        {@link String }
+             * 
              */
             public void setText(String value) {
                 this.text = value;
@@ -295,9 +290,9 @@ public class Fault {
              * Gets the value of the variables property.
              * 
              * @return
-             *     possible object is
-             *     {@link Variables }
-             *     
+             *         possible object is
+             *         {@link Variables }
+             * 
              */
             public Variables getVariables() {
                 return variables;
@@ -307,19 +302,20 @@ public class Fault {
              * Sets the value of the variables property.
              * 
              * @param value
-             *     allowed object is
-             *     {@link Variables }
-             *     
+             *        allowed object is
+             *        {@link Variables }
+             * 
              */
             public void setVariables(Variables value) {
                 this.variables = value;
             }
 
-
             /**
-             * 

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

              * <complexType>
@@ -336,9 +332,7 @@ public class Fault {
              * 
              */
             @XmlAccessorType(XmlAccessType.FIELD)
-            @XmlType(name = "", propOrder = {
-                "variable"
-            })
+            @XmlType(name = "", propOrder = {"variable"})
             public static class Variables {
 
                 protected List variable;
@@ -354,8 +348,9 @@ public class Fault {
                  * 
                  * 

* For example, to add a new item, do as follows: + * *

-                 *    getVariable().add(newItem);
+                 * getVariable().add(newItem);
                  * 
* * diff --git a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ObjectFactory.java b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ObjectFactory.java index 39581f3c..95eb2cba 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ObjectFactory.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ObjectFactory.java @@ -24,32 +24,31 @@ // Generated on: 2015.02.11 at 04:54:29 PM EST // - package org.onap.aai.domain.restServiceException; import javax.xml.bind.annotation.XmlRegistry; - /** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the org.onap.aai.domain.restServiceException package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the org.onap.aai.domain.restServiceException package. + *

+ * An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.onap.aai.domain.restServiceException + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: + * org.onap.aai.domain.restServiceException * */ public ObjectFactory() { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RESTResponse.java b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RESTResponse.java index 0a6ee1c2..09178937 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RESTResponse.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RESTResponse.java @@ -17,11 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.restServiceException; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -29,11 +27,14 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "requestError" -}) +@JsonPropertyOrder({"requestError"}) public class RESTResponse { @JsonProperty("requestError") @@ -44,7 +45,7 @@ public class RESTResponse { /** * Gets the request error. * - * @return The requestError + * @return The requestError */ @JsonProperty("requestError") public RequestError getRequestError() { @@ -54,7 +55,7 @@ public class RESTResponse { /** * Sets the request error. * - * @param requestError The requestError + * @param requestError The requestError */ @JsonProperty("requestError") public void setRequestError(RequestError requestError) { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RequestError.java b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RequestError.java index bf220775..38320218 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RequestError.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/RequestError.java @@ -17,11 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.restServiceException; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -29,11 +27,14 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "serviceException" -}) +@JsonPropertyOrder({"serviceException"}) public class RequestError { @JsonProperty("serviceException") @@ -44,7 +45,7 @@ public class RequestError { /** * Gets the service exception. * - * @return The serviceException + * @return The serviceException */ @JsonProperty("serviceException") public ServiceException getServiceException() { @@ -54,7 +55,7 @@ public class RequestError { /** * Sets the service exception. * - * @param serviceException The serviceException + * @param serviceException The serviceException */ @JsonProperty("serviceException") public void setServiceException(ServiceException serviceException) { diff --git a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ServiceException.java b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ServiceException.java index 10f136b9..ec658ce3 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ServiceException.java +++ b/aai-core/src/main/java/org/onap/aai/domain/restServiceException/ServiceException.java @@ -17,13 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.domain.restServiceException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -31,13 +27,16 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "messageId", - "text", - "variables" -}) +@JsonPropertyOrder({"messageId", "text", "variables"}) public class ServiceException { @JsonProperty("messageId") @@ -52,7 +51,7 @@ public class ServiceException { /** * Gets the message id. * - * @return The messageId + * @return The messageId */ @JsonProperty("messageId") public String getMessageId() { @@ -62,7 +61,7 @@ public class ServiceException { /** * Sets the message id. * - * @param messageId The messageId + * @param messageId The messageId */ @JsonProperty("messageId") public void setMessageId(String messageId) { @@ -72,7 +71,7 @@ public class ServiceException { /** * Gets the text. * - * @return The text + * @return The text */ @JsonProperty("text") public String getText() { @@ -82,7 +81,7 @@ public class ServiceException { /** * Sets the text. * - * @param text The text + * @param text The text */ @JsonProperty("text") public void setText(String text) { @@ -92,7 +91,7 @@ public class ServiceException { /** * Gets the variables. * - * @return The variables + * @return The variables */ @JsonProperty("variables") public List getVariables() { @@ -102,7 +101,7 @@ public class ServiceException { /** * Sets the variables. * - * @param variables The variables + * @param variables The variables */ @JsonProperty("variables") public void setVariables(List variables) { diff --git a/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntries.java b/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntries.java index ae184d9b..7f02cb53 100644 --- a/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntries.java +++ b/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntries.java @@ -24,7 +24,6 @@ // Generated on: 2015.03.20 at 09:46:47 AM CDT // - package org.onap.aai.domain.translog; import java.util.ArrayList; @@ -35,11 +34,12 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; - /** - *

Java class for anonymous complex type. + *

+ * Java class for anonymous complex type. * - *

The following schema fragment specifies the expected content contained within this class. + *

+ * The following schema fragment specifies the expected content contained within this class. * *

  * <complexType>
@@ -106,14 +106,12 @@ import javax.xml.bind.annotation.XmlType;
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-    "transactionLogEntries"
-})
+@XmlType(name = "", propOrder = {"transactionLogEntries"})
 @XmlRootElement(name = "transaction-log-entries", namespace = "http://org.onap.aai.inventory")
 public class TransactionLogEntries {
 
     protected List transactionLogEntries;
-   
+
     /**
      * Gets the transaction log entries.
      *
@@ -126,5 +124,4 @@ public class TransactionLogEntries {
         return this.transactionLogEntries;
     }
 
-
 }
diff --git a/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntry.java b/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntry.java
index 843afb2f..2ce485be 100644
--- a/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntry.java
+++ b/aai-core/src/main/java/org/onap/aai/domain/translog/TransactionLogEntry.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.domain.translog;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -28,410 +29,396 @@ import javax.xml.bind.annotation.XmlType;
 import org.eclipse.persistence.oxm.annotations.XmlCDATA;
 
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {
-		"transactionLogEntryId",
-		"status",
-		"rqstDate",
-		"respDate",
-		"sourceId",
-		"resourceId",
-		"resourceType",
-		"rqstBuf",
-		"respBuf",
-		"notificationPayload",
-		"notificationId",
-		"notificationStatus",
-		"notificationTopic",
-		"notificationEntityLink",
-		"notificationAction"
-})
+@XmlType(
+        name = "",
+        propOrder = {"transactionLogEntryId", "status", "rqstDate", "respDate", "sourceId", "resourceId",
+                "resourceType", "rqstBuf", "respBuf", "notificationPayload", "notificationId", "notificationStatus",
+                "notificationTopic", "notificationEntityLink", "notificationAction"})
 @XmlRootElement(name = "transaction-log-entry", namespace = "http://org.onap.aai.inventory")
 public class TransactionLogEntry {
 
-	@XmlElement(name = "transaction-log-entry-id", required = true)
-	protected String transactionLogEntryId;
-	@XmlElement(name = "status")
-	protected String status;
-	@XmlElement(name = "rqst-date")
-	protected String rqstDate;
-	@XmlElement(name = "resp-date")
-	protected String respDate;
-	@XmlElement(name = "source-id")
-	protected String sourceId;
-	@XmlElement(name = "resource-id")
-	protected String resourceId;
-	@XmlElement(name = "resource-type")
-	protected String resourceType;
-	@XmlElement(name = "rqst-buf")
-	protected String rqstBuf;
-	@XmlElement(name = "resp-buf")
-	protected String respBuf;
-	@XmlElement(name = "notification-payload")
-	protected String notificationPayload;
-	@XmlElement(name = "notification-id")
-	protected String notificationId;
-	@XmlElement(name = "notification-status")
-	protected String notificationStatus;
-	@XmlElement(name = "notification-topic")
-	private String notificationTopic;
-	@XmlElement(name = "notification-entity-link")
-	private String notificationEntityLink;
-	@XmlElement(name = "notification-action")
-	private String notificationAction;
-
-	/**
-	 * Gets the value of the transcationLogEntryId property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getTransactionLogEntryId() {
-		return transactionLogEntryId;
-	}
-
-	/**
-	 * Sets the value of the transactionLogEntryId property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setTransactionLogEntryId(String value) {
-		this.transactionLogEntryId = value;
-	}
-
-	/**
-	 * Gets the value of the status property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getStatus() {
-		return status;
-	}
-
-	/**
-	 * Sets the value of the status property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setStatus(String value) {
-		this.status = value;
-	}
-
-	/**
-	 * Gets the value of the rqstDate property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-
-	public String getRqstDate() {
-		return rqstDate;
-	}
-
-	/**
-	 * Sets the value of the rqstDate property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setRqstDate(String value) {
-		this.rqstDate = value;
-	}
-
-
-	/**
-	 * Gets the value of the respDate property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-
-	public String getRespDate() {
-		return respDate;
-	}
-
-	/**
-	 * Sets the value of the respDate property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setRespDate(String value) {
-		this.respDate = value;
-	}
-	/**
-	 * Gets the value of the sourceId property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getSourceId() {
-		return sourceId;
-	}
-
-	/**
-	 * Sets the value of the sourceId property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setSourceId(String value) {
-		this.sourceId = value;
-	}
-
-	/**
-	 * Gets the value of the resourceId property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getResourceId() {
-		return resourceId;
-	}
-
-	/**
-	 * Sets the value of the resourceId property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setResourceId(String value) {
-		this.resourceId = value;
-	}
-
-	/**
-	 * Gets the value of the resourceType property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getResourceType() {
-		return resourceType;
-	}
-
-	/**
-	 * Sets the value of the resourceType property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setResourceType(String value) {
-		this.resourceType = value;
-	}
-
-	/**
-	 * Gets the value of the rqstBuf property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getRqstBuf() {
-		return rqstBuf;
-	}
-
-	/**
-	 * Sets the value of the rqstBuf property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	@XmlCDATA
-	public void setRqstBuf(String value) {
-		this.rqstBuf = value;
-	}
-
-	/**
-	 * Gets the value of the respBuf property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getrespBuf() {
-		return respBuf;
-	}
-
-	/**
-	 * Sets the value of the respBuf property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	@XmlCDATA
-	public void setrespBuf(String value) {
-		this.respBuf = value;
-	}
-
-	/**
-	 * Gets the value of the notificationPayload property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getNotificationPayload() {
-		return notificationPayload;
-	}
-
-	/**
-	 * Sets the value of the notificationPayload property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	@XmlCDATA
-	public void setNotificationPayload(String value) {
-		this.notificationPayload = value;
-	}
-
-
-	/**
-	 * Gets the value of the notificationId property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getNotificationId() {
-		return notificationId;
-	}
-
-	/**
-	 * Sets the value of the notificationId property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setNotificationId(String value) {
-		this.notificationId = value;
-	}
-
-	/**
-	 * Gets the value of the notificationId property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getNotificationStatus() {
-		return notificationStatus;
-	}
-
-	/**
-	 * Sets the value of the notificationId property.
-	 * 
-	 * @param value
-	 *     allowed object is
-	 *     {@link String }
-	 *     
-	 */
-	public void setNotificationStatus(String value) {
-		this.notificationStatus = value;
-	}
-
-	/**
-	 * Gets the value of the notificationTopic property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getNotificationTopic() {
-		return notificationTopic;
-	}
-
-	/**
-	 * Sets the value of the notificationTopic property.
-	 *
-	 * @param topic the new notification topic
-	 */
-	public void setNotificationTopic(String topic) {
-		this.notificationTopic = topic;
-	}
-
-	/**
-	 * Gets the value of the notificationEntityLink property.
-	 * 
-	 * @return
-	 *     possible object is
-	 *     {@link String }
-	 *     
-	 */
-	public String getNotificationEntityLink() {
-		return notificationEntityLink;
-	}
-
-	/**
-	 * Sets the value of the notificationEntityLink property.
-	 *
-	 * @param entityLink the new notification entity link
-	 */
-	public void setNotificationEntityLink(String entityLink) {
-		this.notificationEntityLink = entityLink;
-	}
-
-	/**
-	 * Sets the value of the notificationAction property.
-	 *
-	 * @return the notification action
-	 */
-	public String getNotificationAction() {
-		return notificationAction;
-	}
-
-	/**
-	 * Sets the value of the notificationAction property.
-	 *
-	 * @param action the new notification action
-	 */
-	public void setNotificationAction(String action) {
-		this.notificationAction = action;
-	}
-
+    @XmlElement(name = "transaction-log-entry-id", required = true)
+    protected String transactionLogEntryId;
+    @XmlElement(name = "status")
+    protected String status;
+    @XmlElement(name = "rqst-date")
+    protected String rqstDate;
+    @XmlElement(name = "resp-date")
+    protected String respDate;
+    @XmlElement(name = "source-id")
+    protected String sourceId;
+    @XmlElement(name = "resource-id")
+    protected String resourceId;
+    @XmlElement(name = "resource-type")
+    protected String resourceType;
+    @XmlElement(name = "rqst-buf")
+    protected String rqstBuf;
+    @XmlElement(name = "resp-buf")
+    protected String respBuf;
+    @XmlElement(name = "notification-payload")
+    protected String notificationPayload;
+    @XmlElement(name = "notification-id")
+    protected String notificationId;
+    @XmlElement(name = "notification-status")
+    protected String notificationStatus;
+    @XmlElement(name = "notification-topic")
+    private String notificationTopic;
+    @XmlElement(name = "notification-entity-link")
+    private String notificationEntityLink;
+    @XmlElement(name = "notification-action")
+    private String notificationAction;
+
+    /**
+     * Gets the value of the transcationLogEntryId property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getTransactionLogEntryId() {
+        return transactionLogEntryId;
+    }
+
+    /**
+     * Sets the value of the transactionLogEntryId property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setTransactionLogEntryId(String value) {
+        this.transactionLogEntryId = value;
+    }
+
+    /**
+     * Gets the value of the status property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets the value of the status property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setStatus(String value) {
+        this.status = value;
+    }
+
+    /**
+     * Gets the value of the rqstDate property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+
+    public String getRqstDate() {
+        return rqstDate;
+    }
+
+    /**
+     * Sets the value of the rqstDate property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setRqstDate(String value) {
+        this.rqstDate = value;
+    }
+
+    /**
+     * Gets the value of the respDate property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+
+    public String getRespDate() {
+        return respDate;
+    }
+
+    /**
+     * Sets the value of the respDate property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setRespDate(String value) {
+        this.respDate = value;
+    }
+
+    /**
+     * Gets the value of the sourceId property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getSourceId() {
+        return sourceId;
+    }
+
+    /**
+     * Sets the value of the sourceId property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setSourceId(String value) {
+        this.sourceId = value;
+    }
+
+    /**
+     * Gets the value of the resourceId property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    /**
+     * Sets the value of the resourceId property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setResourceId(String value) {
+        this.resourceId = value;
+    }
+
+    /**
+     * Gets the value of the resourceType property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    /**
+     * Sets the value of the resourceType property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setResourceType(String value) {
+        this.resourceType = value;
+    }
+
+    /**
+     * Gets the value of the rqstBuf property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getRqstBuf() {
+        return rqstBuf;
+    }
+
+    /**
+     * Sets the value of the rqstBuf property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    @XmlCDATA
+    public void setRqstBuf(String value) {
+        this.rqstBuf = value;
+    }
+
+    /**
+     * Gets the value of the respBuf property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getrespBuf() {
+        return respBuf;
+    }
+
+    /**
+     * Sets the value of the respBuf property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    @XmlCDATA
+    public void setrespBuf(String value) {
+        this.respBuf = value;
+    }
+
+    /**
+     * Gets the value of the notificationPayload property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getNotificationPayload() {
+        return notificationPayload;
+    }
+
+    /**
+     * Sets the value of the notificationPayload property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    @XmlCDATA
+    public void setNotificationPayload(String value) {
+        this.notificationPayload = value;
+    }
+
+    /**
+     * Gets the value of the notificationId property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getNotificationId() {
+        return notificationId;
+    }
+
+    /**
+     * Sets the value of the notificationId property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setNotificationId(String value) {
+        this.notificationId = value;
+    }
+
+    /**
+     * Gets the value of the notificationId property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getNotificationStatus() {
+        return notificationStatus;
+    }
+
+    /**
+     * Sets the value of the notificationId property.
+     * 
+     * @param value
+     *        allowed object is
+     *        {@link String }
+     * 
+     */
+    public void setNotificationStatus(String value) {
+        this.notificationStatus = value;
+    }
+
+    /**
+     * Gets the value of the notificationTopic property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getNotificationTopic() {
+        return notificationTopic;
+    }
+
+    /**
+     * Sets the value of the notificationTopic property.
+     *
+     * @param topic the new notification topic
+     */
+    public void setNotificationTopic(String topic) {
+        this.notificationTopic = topic;
+    }
+
+    /**
+     * Gets the value of the notificationEntityLink property.
+     * 
+     * @return
+     *         possible object is
+     *         {@link String }
+     * 
+     */
+    public String getNotificationEntityLink() {
+        return notificationEntityLink;
+    }
+
+    /**
+     * Sets the value of the notificationEntityLink property.
+     *
+     * @param entityLink the new notification entity link
+     */
+    public void setNotificationEntityLink(String entityLink) {
+        this.notificationEntityLink = entityLink;
+    }
+
+    /**
+     * Sets the value of the notificationAction property.
+     *
+     * @return the notification action
+     */
+    public String getNotificationAction() {
+        return notificationAction;
+    }
+
+    /**
+     * Sets the value of the notificationAction property.
+     *
+     * @param action the new notification action
+     */
+    public void setNotificationAction(String action) {
+        this.notificationAction = action;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/exceptions/AAIException.java b/aai-core/src/main/java/org/onap/aai/exceptions/AAIException.java
index 0851e719..bca4b48c 100644
--- a/aai-core/src/main/java/org/onap/aai/exceptions/AAIException.java
+++ b/aai-core/src/main/java/org/onap/aai/exceptions/AAIException.java
@@ -19,6 +19,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.exceptions;
 
 import java.util.Collection;
@@ -30,8 +31,10 @@ import org.onap.aai.logging.ErrorObjectNotFoundException;
 
 public class AAIException extends Exception {
 
-    private static final String UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE = " - update error.properties before using this exception code";
-    private static final String FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE = "Failed to instantiate AAIException with code=";
+    private static final String UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE =
+            " - update error.properties before using this exception code";
+    private static final String FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE =
+            "Failed to instantiate AAIException with code=";
     public static final String DEFAULT_EXCEPTION_CODE = "AAI_4000";
     private static final long serialVersionUID = 1L;
 
@@ -45,13 +48,13 @@ public class AAIException extends Exception {
     public AAIException() {
         super();
         this.code = DEFAULT_EXCEPTION_CODE;
-        this.templateVars = new LinkedList ();
+        this.templateVars = new LinkedList();
 
         try {
             this.errorObject = ErrorLogHelper.getErrorObject(getCode());
         } catch (ErrorObjectNotFoundException e) {
             throw new RuntimeException(FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE + getCode()
-                                         + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
+                    + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
         }
     }
 
@@ -64,16 +67,16 @@ public class AAIException extends Exception {
         super();
 
         this.code = code;
-        this.templateVars = new LinkedList ();
+        this.templateVars = new LinkedList();
 
         try {
             this.errorObject = ErrorLogHelper.getErrorObject(getCode());
         } catch (ErrorObjectNotFoundException e) {
             throw new RuntimeException(FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE + getCode()
-                                         + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
+                    + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
         }
     }
-    
+
     /**
      * Instantiates a new AAI exception.
      *
@@ -84,14 +87,14 @@ public class AAIException extends Exception {
         super(details);
 
         this.code = code;
-        this.templateVars = new LinkedList ();
+        this.templateVars = new LinkedList();
 
         try {
             this.errorObject = ErrorLogHelper.getErrorObject(getCode());
             errorObject.setDetails(details);
         } catch (ErrorObjectNotFoundException e) {
             throw new RuntimeException(FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE + getCode()
-                                         + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
+                    + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
         }
     }
 
@@ -105,16 +108,16 @@ public class AAIException extends Exception {
         super(cause);
 
         this.code = code;
-        this.templateVars = new LinkedList ();
+        this.templateVars = new LinkedList();
 
         try {
             this.errorObject = ErrorLogHelper.getErrorObject(getCode());
         } catch (ErrorObjectNotFoundException e) {
             throw new RuntimeException(FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE + getCode()
-                                         + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
+                    + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
         }
     }
-    
+
     /**
      * Instantiates a new AAI exception.
      *
@@ -126,16 +129,16 @@ public class AAIException extends Exception {
         super(details, cause);
 
         this.code = code;
-        this.templateVars = new LinkedList ();
+        this.templateVars = new LinkedList();
 
         try {
             this.errorObject = ErrorLogHelper.getErrorObject(getCode());
         } catch (ErrorObjectNotFoundException e) {
             throw new RuntimeException(FAILED_TO_INSTANTIATE_AAI_EXCEPTION_WITH_CODE + getCode()
-                                         + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
+                    + UPDATE_ERROR_PROPERTIES_BEFORE_USING_THIS_EXCEPTION_CODE);
         }
     }
-    
+
     public String getCode() {
         return code;
     }
diff --git a/aai-core/src/main/java/org/onap/aai/exceptions/AAIExceptionWithInfo.java b/aai-core/src/main/java/org/onap/aai/exceptions/AAIExceptionWithInfo.java
index 3a75ee95..e7f2901e 100644
--- a/aai-core/src/main/java/org/onap/aai/exceptions/AAIExceptionWithInfo.java
+++ b/aai-core/src/main/java/org/onap/aai/exceptions/AAIExceptionWithInfo.java
@@ -17,117 +17,119 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.exceptions;
 
 import java.util.HashMap;
 
 public class AAIExceptionWithInfo extends AAIException {
 
-	HashMap infoHash;
-	String info;
+    HashMap infoHash;
+    String info;
+
+    /**
+     * Instantiates a new AAI exception with info.
+     *
+     * @param infoHash the info hash
+     * @param info the info
+     */
+    public AAIExceptionWithInfo(HashMap infoHash, String info) {
+        super();
+        setInfoHash(infoHash);
+        setInfo(info);
+    }
+
+    /**
+     * Instantiates a new AAI exception with info.
+     *
+     * @param code the code
+     * @param infoHash the info hash
+     * @param info the info
+     */
+    public AAIExceptionWithInfo(String code, HashMap infoHash, String info) {
+        super(code);
+        setInfoHash(infoHash);
+        setInfo(info);
+    }
+
+    /**
+     * Instantiates a new AAI exception with info.
+     *
+     * @param code the code
+     * @param details the details
+     * @param infoHash the info hash
+     * @param info the info
+     */
+    public AAIExceptionWithInfo(String code, String details, HashMap infoHash, String info) {
+        super(code, details);
+        setInfoHash(infoHash);
+        setInfo(info);
+    }
+
+    /**
+     * Instantiates a new AAI exception with info.
+     *
+     * @param code the code
+     * @param cause the cause
+     * @param infoHash the info hash
+     * @param info the info
+     */
+    public AAIExceptionWithInfo(String code, Throwable cause, HashMap infoHash, String info) {
+        super(code, cause);
+        setInfoHash(infoHash);
+        setInfo(info);
+    }
 
-	/**
-	 * Instantiates a new AAI exception with info.
-	 *
-	 * @param infoHash the info hash
-	 * @param info the info
-	 */
-	public AAIExceptionWithInfo(HashMap infoHash, String info) {
-		super();
-		setInfoHash(infoHash);
-		setInfo(info);
-	}
+    /**
+     * Instantiates a new AAI exception with info.
+     *
+     * @param code the code
+     * @param cause the cause
+     * @param details the details
+     * @param infoHash the info hash
+     * @param info the info
+     */
+    public AAIExceptionWithInfo(String code, Throwable cause, String details, HashMap infoHash,
+            String info) {
+        super(code, cause, details);
+        setInfoHash(infoHash);
+        setInfo(info);
+    }
 
-	/**
-	 * Instantiates a new AAI exception with info.
-	 *
-	 * @param code the code
-	 * @param infoHash the info hash
-	 * @param info the info
-	 */
-	public AAIExceptionWithInfo(String code, HashMap infoHash, String info) {
-		super(code);
-		setInfoHash(infoHash);
-		setInfo(info);
-	}
-	
-	/**
-	 * Instantiates a new AAI exception with info.
-	 *
-	 * @param code the code
-	 * @param details the details
-	 * @param infoHash the info hash
-	 * @param info the info
-	 */
-	public AAIExceptionWithInfo(String code, String details, HashMap infoHash, String info) {
-		super(code, details);
-		setInfoHash(infoHash);
-		setInfo(info);
-	}
+    /**
+     * Gets the info hash.
+     *
+     * @return the info hash
+     */
+    public HashMap getInfoHash() {
+        return infoHash;
+    }
 
-	/**
-	 * Instantiates a new AAI exception with info.
-	 *
-	 * @param code the code
-	 * @param cause the cause
-	 * @param infoHash the info hash
-	 * @param info the info
-	 */
-	public AAIExceptionWithInfo(String code, Throwable cause, HashMap infoHash, String info) {
-		super(code, cause);
-		setInfoHash(infoHash);
-		setInfo(info);
-	}
-	
-	/**
-	 * Instantiates a new AAI exception with info.
-	 *
-	 * @param code the code
-	 * @param cause the cause
-	 * @param details the details
-	 * @param infoHash the info hash
-	 * @param info the info
-	 */
-	public AAIExceptionWithInfo(String code, Throwable cause, String details, HashMap infoHash, String info) {
-		super(code, cause, details);
-		setInfoHash(infoHash);
-		setInfo(info);
-	}
-	
-	/**
-	 * Gets the info hash.
-	 *
-	 * @return the info hash
-	 */
-	public HashMap getInfoHash() {
-		return infoHash;
-	}
+    /**
+     * Sets the info hash.
+     *
+     * @param infoHash the info hash
+     */
+    public void setInfoHash(HashMap infoHash) {
+        this.infoHash = infoHash;
+    }
 
-	/**
-	 * Sets the info hash.
-	 *
-	 * @param infoHash the info hash
-	 */
-	public void setInfoHash(HashMap infoHash) {
-		this.infoHash = infoHash;
-	}
+    /**
+     * Gets the info.
+     *
+     * @return the info
+     */
+    public String getInfo() {
+        return info;
+    }
 
-	/**
-	 * Gets the info.
-	 *
-	 * @return the info
-	 */
-	public String getInfo() {
-		return info;
-	}
+    /**
+     * Sets the info.
+     *
+     * @param info the new info
+     */
+    public void setInfo(String info) {
+        this.info = info;
+    }
 
-	/**
-	 * Sets the info.
-	 *
-	 * @param info the new info
-	 */
-	public void setInfo(String info) {
-		this.info = info;
-	}
-	
 }
diff --git a/aai-core/src/main/java/org/onap/aai/extensions/AAIExtensionMap.java b/aai-core/src/main/java/org/onap/aai/extensions/AAIExtensionMap.java
index 7b125496..a6d7ac17 100644
--- a/aai-core/src/main/java/org/onap/aai/extensions/AAIExtensionMap.java
+++ b/aai-core/src/main/java/org/onap/aai/extensions/AAIExtensionMap.java
@@ -17,8 +17,17 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.extensions;
 
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
@@ -28,797 +37,791 @@ import org.onap.aai.rest.db.DBRequest;
 import org.onap.aai.rest.db.HttpEntry;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.UriInfo;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-
 public class AAIExtensionMap {
-	// =======================================================================
-	// Attribute | Type
-	// =======================================================================
-	// message | java.lang.String (RW)
-	// ----------------------------------------------------------------------
-	// templateVars | java.lang.ArrayList (RW)
-	// -----------------------------------------------------------------------
-	// preExtException | java.lang.Exception (RW)
-	// -----------------------------------------------------------------------
-	// preExtErrorCallback | java.lang.reflect.Method (RW)
-	// -----------------------------------------------------------------------
-	// postExtException | java.lang.Exception (RW)
-	// -----------------------------------------------------------------------
-	// postExtErrorCallback | java.lang.reflect.Method (RW)
-	// -----------------------------------------------------------------------
-	// servletRequest | javax.servlet.http.HttpServletRequest (RO)
-	// -----------------------------------------------------------------------
-	// headers | javax.ws.rs.core.HttpHeaders (RO)
-	// -----------------------------------------------------------------------
-	// objFromRequestType | String (ex. ?org.onap.aai.domain.yang.Vce?) (RO)
-	// -----------------------------------------------------------------------
-	// objFromRequest | $TYPE {ObjFromRequestType) (RO)
-	// -----------------------------------------------------------------------
-	// preExtFailOnError | java.lang.Boolean (RW)
-	// -----------------------------------------------------------------------
-	// postExtFailOnError | java.lang.Boolean (RW)
-	// -----------------------------------------------------------------------
-	// preExtSkipErrorCallback | java.lang.Boolean (RW)
-	// -----------------------------------------------------------------------
-	// postExtSkipErrorCallback | java.lang.Boolean (RW)
-	// -----------------------------------------------------------------------
-	// graph | org.janusgraph.core.JanusGraph (RW)
-	// -----------------------------------------------------------------------
-	// objectFromResponse | Object
-	// -----------------------------------------------------------------------
-	// precheckAddedList | java.util.HashMap
-	// -----------------------------------------------------------------------
-	// precheckResponseMessages | org.onap.aai.extensions.AAIResponseMessages
-	// =======================================================================
-
-	private String message;
-	private ArrayList templateVars;
-	private Exception preExtException;
-	private Exception postExtException;
-	private Method preExtErrorCallback;
-	private Method postExtErrorCallback;
-	private HttpServletRequest servletRequest;
-	private HttpHeaders httpHeaders;
-	private String objectFromRequestType;
-	private Object objectFromRequest;
-	private boolean preExtFailOnError = true;
-	private boolean postExtFailOnError = true;
-	private boolean preExtSkipErrorCallback = true;
-	private boolean postExtSkipErrorCallback = true;
-	private String fromAppId;
-	private String transId;
-	private Graph graph;
-	private Object objectFromResponse;
-	private HashMap lookupHashMap;
-	private HashMap> precheckAddedList;
-	private AAIResponseMessages precheckResponseMessages;
-	private HashMap topology;
-	private HashMap vertexCache;
-	private String baseObject;
-	private String namespace;
-	private String fullResourceName;
-	private String topObjectFullResourceName;
-	private String uri;
-	private String notificationUri;
-	private String apiVersion;
-	private long startTime;
-	private long checkpointTime;
-	private DynamicJAXBContext jaxbContext;
-	private String objectFromResponseType;
-	private String eventAction;
-	private TransactionalGraphEngine dbEngine;
-	private Loader loader;
-	private UriInfo uriInfo;
-	private DBRequest dbRequest;
-	private HttpEntry httpEntry;
-	/**
-	 * Sets the message.
-	 *
-	 * @param _message the new message
-	 */
-	public void setMessage(String _message) {
-		this.message = _message;
-	}
-
-	/**
-	 * Sets the template vars.
-	 *
-	 * @param _templateVars the new template vars
-	 */
-	public void setTemplateVars(ArrayList _templateVars) {
-		this.templateVars = _templateVars;
-	}
-
-	/**
-	 * Sets the pre ext exception.
-	 *
-	 * @param _exception the new pre ext exception
-	 */
-	public void setPreExtException(Exception _exception) {
-		this.preExtException = _exception;
-	}
-
-	/**
-	 * Sets the pre ext error callback.
-	 *
-	 * @param _errorCallback the new pre ext error callback
-	 */
-	public void setPreExtErrorCallback(Method _errorCallback) {
-		this.preExtErrorCallback = _errorCallback;
-	}
-
-	/**
-	 * Sets the post ext exception.
-	 *
-	 * @param _exception the new post ext exception
-	 */
-	public void setPostExtException(Exception _exception) {
-		this.postExtException = _exception;
-	}
-
-	/**
-	 * Sets the post ext error callback.
-	 *
-	 * @param _errorCallback the new post ext error callback
-	 */
-	public void setPostExtErrorCallback(Method _errorCallback) {
-		this.postExtErrorCallback = _errorCallback;
-	}
-
-	/**
-	 * Sets the servlet request.
-	 *
-	 * @param _httpServletRequest the new servlet request
-	 */
-	public void setServletRequest(HttpServletRequest _httpServletRequest) {
-		this.servletRequest = _httpServletRequest;
-	}
-
-	/**
-	 * Sets the http headers.
-	 *
-	 * @param _httpHeaders the new http headers
-	 */
-	public void setHttpHeaders(HttpHeaders _httpHeaders) {
-		this.httpHeaders = _httpHeaders;
-	}
-
-	/**
-	 * Sets the object from request type.
-	 *
-	 * @param _objectFromRequestType the new object from request type
-	 */
-	public void setObjectFromRequestType(String _objectFromRequestType) {
-		this.objectFromRequestType = _objectFromRequestType;
-	}
-
-	/**
-	 * Sets the object from request.
-	 *
-	 * @param _objectFromRequest the new object from request
-	 */
-	public void setObjectFromRequest(Object _objectFromRequest) {
-		this.objectFromRequest = _objectFromRequest;
-	}
-
-	/**
-	 * Sets the object from response type.
-	 *
-	 * @param resourceClassName the new object from response type
-	 */
-	public void setObjectFromResponseType(String resourceClassName) {
-		// TODO Auto-generated method stub
-		this.objectFromResponseType = resourceClassName;
-	}
-	
-	/**
-	 * Gets the object from response type.
-	 *
-	 * @return the object from response type
-	 */
-	public String getObjectFromResponseType() {
-		// TODO Auto-generated method stub
-		return this.objectFromResponseType;
-	}
-	
-	/**
-	 * Sets the pre ext fail on error.
-	 *
-	 * @param _failOnError the new pre ext fail on error
-	 */
-	public void setPreExtFailOnError(boolean _failOnError) {
-		this.preExtFailOnError = _failOnError;
-	}
-
-	/**
-	 * Sets the post ext fail on error.
-	 *
-	 * @param _failOnError the new post ext fail on error
-	 */
-	public void setPostExtFailOnError(boolean _failOnError) {
-		this.postExtFailOnError = _failOnError;
-	}
-
-	/**
-	 * Gets the message.
-	 *
-	 * @return the message
-	 */
-	public String getMessage() {
-		return this.message;
-	}
-
-	/**
-	 * Gets the template vars.
-	 *
-	 * @return the template vars
-	 */
-	public ArrayList getTemplateVars() {
-		if (this.templateVars == null) {
-			this.templateVars = new ArrayList();
-		}
-		return this.templateVars;
-	}
-
-	/**
-	 * Gets the pre ext exception.
-	 *
-	 * @return the pre ext exception
-	 */
-	public Exception getPreExtException() {
-		return this.preExtException;
-	}
-
-	/**
-	 * Gets the pre ext error callback.
-	 *
-	 * @return the pre ext error callback
-	 */
-	public Method getPreExtErrorCallback() {
-		return this.preExtErrorCallback;
-	}
-
-	/**
-	 * Gets the post ext exception.
-	 *
-	 * @return the post ext exception
-	 */
-	public Exception getPostExtException() {
-		return this.postExtException;
-	}
-
-	/**
-	 * Gets the post ext error callback.
-	 *
-	 * @return the post ext error callback
-	 */
-	public Method getPostExtErrorCallback() {
-		return this.postExtErrorCallback;
-	}
-
-	/**
-	 * Gets the http servlet request.
-	 *
-	 * @return the http servlet request
-	 */
-	public HttpServletRequest getHttpServletRequest() {
-		return this.servletRequest;
-	}
-
-	/**
-	 * Gets the http headers.
-	 *
-	 * @return the http headers
-	 */
-	public HttpHeaders getHttpHeaders() {
-		return this.httpHeaders;
-	}
-
-	/**
-	 * Gets the object from request type.
-	 *
-	 * @return the object from request type
-	 */
-	public String getObjectFromRequestType() {
-		return this.objectFromRequestType;
-	}
-
-	/**
-	 * Gets the object from request.
-	 *
-	 * @return the object from request
-	 */
-	public Object getObjectFromRequest() {
-		return this.objectFromRequest;
-	}
-
-	/**
-	 * Gets the pre ext fail on error.
-	 *
-	 * @return the pre ext fail on error
-	 */
-	public boolean getPreExtFailOnError() {
-		return this.preExtFailOnError;
-	}
-
-	/**
-	 * Gets the post ext fail on error.
-	 *
-	 * @return the post ext fail on error
-	 */
-	public boolean getPostExtFailOnError() {
-		return this.postExtFailOnError;
-	}
-
-	/**
-	 * Gets the from app id.
-	 *
-	 * @return the from app id
-	 */
-	public String getFromAppId() {
-		return this.fromAppId;
-	}
-
-	/**
-	 * Sets the from app id.
-	 *
-	 * @param fromAppId the new from app id
-	 */
-	public void setFromAppId(String fromAppId) {
-		this.fromAppId = fromAppId;
-	}
-
-	/**
-	 * Gets the trans id.
-	 *
-	 * @return the trans id
-	 */
-	public String getTransId() {
-		return this.transId;
-	}
-
-	/**
-	 * Sets the trans id.
-	 *
-	 * @param transId the new trans id
-	 */
-	public void setTransId(String transId) {
-		this.transId = transId;
-	}
-	
-	/**
-	 * Gets the pre ext skip error callback.
-	 *
-	 * @return the pre ext skip error callback
-	 */
-	public boolean getPreExtSkipErrorCallback() {
-		return preExtSkipErrorCallback;
-	}
-
-	/**
-	 * Sets the pre ext skip error callback.
-	 *
-	 * @param preExtSkipErrorCallback the new pre ext skip error callback
-	 */
-	public void setPreExtSkipErrorCallback(boolean preExtSkipErrorCallback) {
-		this.preExtSkipErrorCallback = preExtSkipErrorCallback;
-	}
-
-	/**
-	 * Gets the post ext skip error callback.
-	 *
-	 * @return the post ext skip error callback
-	 */
-	public boolean getPostExtSkipErrorCallback() {
-		return postExtSkipErrorCallback;
-	}
-
-	/**
-	 * Sets the post ext skip error callback.
-	 *
-	 * @param postExtSkipErrorCallback the new post ext skip error callback
-	 */
-	public void setPostExtSkipErrorCallback(boolean postExtSkipErrorCallback) {
-		this.postExtSkipErrorCallback = postExtSkipErrorCallback;
-	}
-
-	/**
-	 * Gets the graph.
-	 *
-	 * @return the graph
-	 */
-	public Graph getGraph() {
-		return graph;
-	}
-
-	/**
-	 * Sets the graph.
-	 *
-	 * @param graph the new graph
-	 */
-	public void setGraph(Graph graph) {
-		this.graph = graph;
-	}
-
-	/**
-	 * Gets the object from response.
-	 *
-	 * @return the object from response
-	 */
-	public Object getObjectFromResponse() {
-		return objectFromResponse;
-	}
-
-	/**
-	 * Sets the object from response.
-	 *
-	 * @param objectFromResponse the new object from response
-	 */
-	public void setObjectFromResponse(Object objectFromResponse) {
-		this.objectFromResponse = objectFromResponse;
-	}
-
-	/**
-	 * Gets the lookup hash map.
-	 *
-	 * @return the lookup hash map
-	 */
-	public HashMap getLookupHashMap() {
-		if (this.lookupHashMap == null) {
-			this.lookupHashMap = new HashMap();
-		}
-		return this.lookupHashMap;
-	}
-
-	/**
-	 * Sets the lookup hash map.
-	 *
-	 * @param lookupHashMap the lookup hash map
-	 */
-	public void setLookupHashMap(HashMap lookupHashMap) {
-		this.lookupHashMap = lookupHashMap;
-	}
-
-	/**
-	 * Gets the precheck added list.
-	 *
-	 * @return the precheck added list
-	 */
-	public HashMap> getPrecheckAddedList() {
-		if (this.precheckAddedList == null) {
-			this.precheckAddedList = new HashMap>();
-		}
-		return precheckAddedList;
-	}
-
-	/**
-	 * Sets the precheck added list.
-	 *
-	 * @param precheckAddedList the precheck added list
-	 */
-	public void setPrecheckAddedList(HashMap> precheckAddedList) {
-		this.precheckAddedList = precheckAddedList;
-	}
-
-	/**
-	 * Gets the precheck response messages.
-	 *
-	 * @return the precheck response messages
-	 */
-	public AAIResponseMessages getPrecheckResponseMessages() {
-		if (this.precheckResponseMessages == null) { 
-			this.precheckResponseMessages = new AAIResponseMessages();
-		}
-		return precheckResponseMessages;
-	}
-
-	/**
-	 * Sets the precheck response messages.
-	 *
-	 * @param precheckResponseData the new precheck response messages
-	 */
-	public void setPrecheckResponseMessages(AAIResponseMessages precheckResponseData) {
-		this.precheckResponseMessages = precheckResponseData;
-	}
-
-	/**
-	 * Gets the topology.
-	 *
-	 * @return the topology
-	 */
-	public HashMap getTopology() {
-		if (this.topology == null) { 
-			this.topology = new HashMap();
-		}
-		return topology;
-	}
-	
-	/**
-	 * Gets the vertex cache.
-	 *
-	 * @return the vertex cache
-	 */
-	public HashMap getVertexCache() {
-		if (this.vertexCache == null) { 
-			this.vertexCache = new HashMap();
-		}
-		return vertexCache;
-	}
-
-	/**
-	 * Gets the base object.
-	 *
-	 * @return the base object
-	 */
-	public String getBaseObject() {
-		return baseObject;
-	}
-
-	/**
-	 * Sets the base object.
-	 *
-	 * @param baseObject the new base object
-	 */
-	public void setBaseObject(String baseObject) {
-		this.baseObject = baseObject;
-	}
-
-	/**
-	 * Gets the namespace.
-	 *
-	 * @return the namespace
-	 */
-	public String getNamespace() {
-		return namespace;
-	}
-
-	/**
-	 * Sets the namespace.
-	 *
-	 * @param namespace the new namespace
-	 */
-	public void setNamespace(String namespace) {
-		this.namespace = namespace;
-	}
-
-	/**
-	 * Gets the full resource name.
-	 *
-	 * @return the full resource name
-	 */
-	public String getFullResourceName() {
-		return fullResourceName;
-	}
-
-	/**
-	 * Sets the full resource name.
-	 *
-	 * @param fullResourceName the new full resource name
-	 */
-	public void setFullResourceName(String fullResourceName) {
-		this.fullResourceName = fullResourceName;
-	}
-
-	/**
-	 * Gets the top object full resource name.
-	 *
-	 * @return the top object full resource name
-	 */
-	public String getTopObjectFullResourceName() {
-		return topObjectFullResourceName;
-	}
-
-	/**
-	 * Sets the top object full resource name.
-	 *
-	 * @param topObjectFullResourceName the new top object full resource name
-	 */
-	public void setTopObjectFullResourceName(String topObjectFullResourceName) {
-		this.topObjectFullResourceName = topObjectFullResourceName;
-	}
-
-	/**
-	 * Gets the uri.
-	 *
-	 * @return the uri
-	 */
-	public String getUri() {
-		return uri;
-	}
-
-	/**
-	 * Sets the uri.
-	 *
-	 * @param uri the new uri
-	 */
-	public void setUri(String uri) {
-		this.uri = uri;
-	}
-
-	/**
-	 * Gets the api version.
-	 *
-	 * @return the api version
-	 */
-	public String getApiVersion() {
-		return apiVersion;
-	}
-
-	/**
-	 * Sets the api version.
-	 *
-	 * @param apiVersion the new api version
-	 */
-	public void setApiVersion(String apiVersion) {
-		this.apiVersion = apiVersion;
-	}
-
-	/**
-	 * Sets the notification uri.
-	 *
-	 * @param uri the new notification uri
-	 */
-	public void setNotificationUri(String uri) {
-		this.notificationUri = uri;
-		
-	}
-	
-	/**
-	 * Gets the notification uri.
-	 *
-	 * @return the notification uri
-	 */
-	public String getNotificationUri() {
-		return this.notificationUri;
-		
-	}
-
-	/**
-	 * Gets the start time.
-	 *
-	 * @return the start time
-	 */
-	public long getStartTime() {
-		return startTime;
-	}
-
-	/**
-	 * Sets the start time.
-	 *
-	 * @param startTime the new start time
-	 */
-	public void setStartTime(long startTime) {
-		this.startTime = startTime;
-	}
-
-	/**
-	 * Gets the checkpoint time.
-	 *
-	 * @return the checkpoint time
-	 */
-	public long getCheckpointTime() {
-		return checkpointTime;
-	}
-
-	/**
-	 * Sets the checkpoint time.
-	 *
-	 * @param checkpointTime the new checkpoint time
-	 */
-	public void setCheckpointTime(long checkpointTime) {
-		this.checkpointTime = checkpointTime;
-	}
-
-	/**
-	 * Gets the jaxb context.
-	 *
-	 * @return the jaxb context
-	 */
-	public DynamicJAXBContext getJaxbContext() {
-		return jaxbContext;
-	}
-
-	/**
-	 * Sets the jaxb context.
-	 *
-	 * @param jaxbContext the new jaxb context
-	 */
-	public void setJaxbContext(DynamicJAXBContext jaxbContext) {
-		this.jaxbContext = jaxbContext;
-	}
-
-	/**
-	 * Sets the event action.
-	 *
-	 * @param eventAction the new event action
-	 */
-	public void setEventAction(String eventAction) {
-		this.eventAction = eventAction;
-	}
-	
-	/**
-	 * Gets the event action.
-	 *
-	 * @return the event action
-	 */
-	public String getEventAction() {
-		return this.eventAction;
-	}
-
-	/**
-	 * Gets the transactional graph engine.
-	 *
-	 * @return the transactional graph engine
-	 */
-	public TransactionalGraphEngine getTransactionalGraphEngine() {
-		return this.dbEngine;
-		
-	}
-	
-	/**
-	 * Sets the transactional graph engine.
-	 *
-	 * @param dbEngine the new transactional graph engine
-	 */
-	public void setTransactionalGraphEngine(TransactionalGraphEngine dbEngine) {
-		this.dbEngine = dbEngine;
-
-	}
-
-	/**
-	 * Gets the loader.
-	 *
-	 * @return the loader
-	 */
-	public Loader getLoader() {
-		return loader;
-	}
-
-	/**
-	 * Sets the loader.
-	 *
-	 * @param loader the new loader
-	 */
-	public void setLoader(Loader loader) {
-		this.loader = loader;
-	}
-
-	/**
-	 * Gets the uri info.
-	 *
-	 * @return the uri info
-	 */
-	public UriInfo getUriInfo() {
-		return uriInfo;
-	}
-
-	/**
-	 * Sets the uri info.
-	 *
-	 * @param uriInfo the new uri info
-	 */
-	public void setUriInfo(UriInfo uriInfo) {
-		this.uriInfo = uriInfo;
-	}
-
-	public DBRequest getDbRequest() {
-		return dbRequest;
-	}
-
-	public void setDbRequest(DBRequest dbRequest) {
-		this.dbRequest = dbRequest;
-	}
-
-	public HttpEntry getHttpEntry() {
-		return httpEntry;
-	}
-
-	public void setHttpEntry(HttpEntry httpEntry) {
-		this.httpEntry = httpEntry;
-	}	
+    // =======================================================================
+    // Attribute | Type
+    // =======================================================================
+    // message | java.lang.String (RW)
+    // ----------------------------------------------------------------------
+    // templateVars | java.lang.ArrayList (RW)
+    // -----------------------------------------------------------------------
+    // preExtException | java.lang.Exception (RW)
+    // -----------------------------------------------------------------------
+    // preExtErrorCallback | java.lang.reflect.Method (RW)
+    // -----------------------------------------------------------------------
+    // postExtException | java.lang.Exception (RW)
+    // -----------------------------------------------------------------------
+    // postExtErrorCallback | java.lang.reflect.Method (RW)
+    // -----------------------------------------------------------------------
+    // servletRequest | javax.servlet.http.HttpServletRequest (RO)
+    // -----------------------------------------------------------------------
+    // headers | javax.ws.rs.core.HttpHeaders (RO)
+    // -----------------------------------------------------------------------
+    // objFromRequestType | String (ex. ?org.onap.aai.domain.yang.Vce?) (RO)
+    // -----------------------------------------------------------------------
+    // objFromRequest | $TYPE {ObjFromRequestType) (RO)
+    // -----------------------------------------------------------------------
+    // preExtFailOnError | java.lang.Boolean (RW)
+    // -----------------------------------------------------------------------
+    // postExtFailOnError | java.lang.Boolean (RW)
+    // -----------------------------------------------------------------------
+    // preExtSkipErrorCallback | java.lang.Boolean (RW)
+    // -----------------------------------------------------------------------
+    // postExtSkipErrorCallback | java.lang.Boolean (RW)
+    // -----------------------------------------------------------------------
+    // graph | org.janusgraph.core.JanusGraph (RW)
+    // -----------------------------------------------------------------------
+    // objectFromResponse | Object
+    // -----------------------------------------------------------------------
+    // precheckAddedList | java.util.HashMap
+    // -----------------------------------------------------------------------
+    // precheckResponseMessages | org.onap.aai.extensions.AAIResponseMessages
+    // =======================================================================
+
+    private String message;
+    private ArrayList templateVars;
+    private Exception preExtException;
+    private Exception postExtException;
+    private Method preExtErrorCallback;
+    private Method postExtErrorCallback;
+    private HttpServletRequest servletRequest;
+    private HttpHeaders httpHeaders;
+    private String objectFromRequestType;
+    private Object objectFromRequest;
+    private boolean preExtFailOnError = true;
+    private boolean postExtFailOnError = true;
+    private boolean preExtSkipErrorCallback = true;
+    private boolean postExtSkipErrorCallback = true;
+    private String fromAppId;
+    private String transId;
+    private Graph graph;
+    private Object objectFromResponse;
+    private HashMap lookupHashMap;
+    private HashMap> precheckAddedList;
+    private AAIResponseMessages precheckResponseMessages;
+    private HashMap topology;
+    private HashMap vertexCache;
+    private String baseObject;
+    private String namespace;
+    private String fullResourceName;
+    private String topObjectFullResourceName;
+    private String uri;
+    private String notificationUri;
+    private String apiVersion;
+    private long startTime;
+    private long checkpointTime;
+    private DynamicJAXBContext jaxbContext;
+    private String objectFromResponseType;
+    private String eventAction;
+    private TransactionalGraphEngine dbEngine;
+    private Loader loader;
+    private UriInfo uriInfo;
+    private DBRequest dbRequest;
+    private HttpEntry httpEntry;
+
+    /**
+     * Sets the message.
+     *
+     * @param _message the new message
+     */
+    public void setMessage(String _message) {
+        this.message = _message;
+    }
+
+    /**
+     * Sets the template vars.
+     *
+     * @param _templateVars the new template vars
+     */
+    public void setTemplateVars(ArrayList _templateVars) {
+        this.templateVars = _templateVars;
+    }
+
+    /**
+     * Sets the pre ext exception.
+     *
+     * @param _exception the new pre ext exception
+     */
+    public void setPreExtException(Exception _exception) {
+        this.preExtException = _exception;
+    }
+
+    /**
+     * Sets the pre ext error callback.
+     *
+     * @param _errorCallback the new pre ext error callback
+     */
+    public void setPreExtErrorCallback(Method _errorCallback) {
+        this.preExtErrorCallback = _errorCallback;
+    }
+
+    /**
+     * Sets the post ext exception.
+     *
+     * @param _exception the new post ext exception
+     */
+    public void setPostExtException(Exception _exception) {
+        this.postExtException = _exception;
+    }
+
+    /**
+     * Sets the post ext error callback.
+     *
+     * @param _errorCallback the new post ext error callback
+     */
+    public void setPostExtErrorCallback(Method _errorCallback) {
+        this.postExtErrorCallback = _errorCallback;
+    }
+
+    /**
+     * Sets the servlet request.
+     *
+     * @param _httpServletRequest the new servlet request
+     */
+    public void setServletRequest(HttpServletRequest _httpServletRequest) {
+        this.servletRequest = _httpServletRequest;
+    }
+
+    /**
+     * Sets the http headers.
+     *
+     * @param _httpHeaders the new http headers
+     */
+    public void setHttpHeaders(HttpHeaders _httpHeaders) {
+        this.httpHeaders = _httpHeaders;
+    }
+
+    /**
+     * Sets the object from request type.
+     *
+     * @param _objectFromRequestType the new object from request type
+     */
+    public void setObjectFromRequestType(String _objectFromRequestType) {
+        this.objectFromRequestType = _objectFromRequestType;
+    }
+
+    /**
+     * Sets the object from request.
+     *
+     * @param _objectFromRequest the new object from request
+     */
+    public void setObjectFromRequest(Object _objectFromRequest) {
+        this.objectFromRequest = _objectFromRequest;
+    }
+
+    /**
+     * Sets the object from response type.
+     *
+     * @param resourceClassName the new object from response type
+     */
+    public void setObjectFromResponseType(String resourceClassName) {
+        // TODO Auto-generated method stub
+        this.objectFromResponseType = resourceClassName;
+    }
+
+    /**
+     * Gets the object from response type.
+     *
+     * @return the object from response type
+     */
+    public String getObjectFromResponseType() {
+        // TODO Auto-generated method stub
+        return this.objectFromResponseType;
+    }
+
+    /**
+     * Sets the pre ext fail on error.
+     *
+     * @param _failOnError the new pre ext fail on error
+     */
+    public void setPreExtFailOnError(boolean _failOnError) {
+        this.preExtFailOnError = _failOnError;
+    }
+
+    /**
+     * Sets the post ext fail on error.
+     *
+     * @param _failOnError the new post ext fail on error
+     */
+    public void setPostExtFailOnError(boolean _failOnError) {
+        this.postExtFailOnError = _failOnError;
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @return the message
+     */
+    public String getMessage() {
+        return this.message;
+    }
+
+    /**
+     * Gets the template vars.
+     *
+     * @return the template vars
+     */
+    public ArrayList getTemplateVars() {
+        if (this.templateVars == null) {
+            this.templateVars = new ArrayList();
+        }
+        return this.templateVars;
+    }
+
+    /**
+     * Gets the pre ext exception.
+     *
+     * @return the pre ext exception
+     */
+    public Exception getPreExtException() {
+        return this.preExtException;
+    }
+
+    /**
+     * Gets the pre ext error callback.
+     *
+     * @return the pre ext error callback
+     */
+    public Method getPreExtErrorCallback() {
+        return this.preExtErrorCallback;
+    }
+
+    /**
+     * Gets the post ext exception.
+     *
+     * @return the post ext exception
+     */
+    public Exception getPostExtException() {
+        return this.postExtException;
+    }
+
+    /**
+     * Gets the post ext error callback.
+     *
+     * @return the post ext error callback
+     */
+    public Method getPostExtErrorCallback() {
+        return this.postExtErrorCallback;
+    }
+
+    /**
+     * Gets the http servlet request.
+     *
+     * @return the http servlet request
+     */
+    public HttpServletRequest getHttpServletRequest() {
+        return this.servletRequest;
+    }
+
+    /**
+     * Gets the http headers.
+     *
+     * @return the http headers
+     */
+    public HttpHeaders getHttpHeaders() {
+        return this.httpHeaders;
+    }
+
+    /**
+     * Gets the object from request type.
+     *
+     * @return the object from request type
+     */
+    public String getObjectFromRequestType() {
+        return this.objectFromRequestType;
+    }
+
+    /**
+     * Gets the object from request.
+     *
+     * @return the object from request
+     */
+    public Object getObjectFromRequest() {
+        return this.objectFromRequest;
+    }
+
+    /**
+     * Gets the pre ext fail on error.
+     *
+     * @return the pre ext fail on error
+     */
+    public boolean getPreExtFailOnError() {
+        return this.preExtFailOnError;
+    }
+
+    /**
+     * Gets the post ext fail on error.
+     *
+     * @return the post ext fail on error
+     */
+    public boolean getPostExtFailOnError() {
+        return this.postExtFailOnError;
+    }
+
+    /**
+     * Gets the from app id.
+     *
+     * @return the from app id
+     */
+    public String getFromAppId() {
+        return this.fromAppId;
+    }
+
+    /**
+     * Sets the from app id.
+     *
+     * @param fromAppId the new from app id
+     */
+    public void setFromAppId(String fromAppId) {
+        this.fromAppId = fromAppId;
+    }
+
+    /**
+     * Gets the trans id.
+     *
+     * @return the trans id
+     */
+    public String getTransId() {
+        return this.transId;
+    }
+
+    /**
+     * Sets the trans id.
+     *
+     * @param transId the new trans id
+     */
+    public void setTransId(String transId) {
+        this.transId = transId;
+    }
+
+    /**
+     * Gets the pre ext skip error callback.
+     *
+     * @return the pre ext skip error callback
+     */
+    public boolean getPreExtSkipErrorCallback() {
+        return preExtSkipErrorCallback;
+    }
+
+    /**
+     * Sets the pre ext skip error callback.
+     *
+     * @param preExtSkipErrorCallback the new pre ext skip error callback
+     */
+    public void setPreExtSkipErrorCallback(boolean preExtSkipErrorCallback) {
+        this.preExtSkipErrorCallback = preExtSkipErrorCallback;
+    }
+
+    /**
+     * Gets the post ext skip error callback.
+     *
+     * @return the post ext skip error callback
+     */
+    public boolean getPostExtSkipErrorCallback() {
+        return postExtSkipErrorCallback;
+    }
+
+    /**
+     * Sets the post ext skip error callback.
+     *
+     * @param postExtSkipErrorCallback the new post ext skip error callback
+     */
+    public void setPostExtSkipErrorCallback(boolean postExtSkipErrorCallback) {
+        this.postExtSkipErrorCallback = postExtSkipErrorCallback;
+    }
+
+    /**
+     * Gets the graph.
+     *
+     * @return the graph
+     */
+    public Graph getGraph() {
+        return graph;
+    }
+
+    /**
+     * Sets the graph.
+     *
+     * @param graph the new graph
+     */
+    public void setGraph(Graph graph) {
+        this.graph = graph;
+    }
+
+    /**
+     * Gets the object from response.
+     *
+     * @return the object from response
+     */
+    public Object getObjectFromResponse() {
+        return objectFromResponse;
+    }
+
+    /**
+     * Sets the object from response.
+     *
+     * @param objectFromResponse the new object from response
+     */
+    public void setObjectFromResponse(Object objectFromResponse) {
+        this.objectFromResponse = objectFromResponse;
+    }
+
+    /**
+     * Gets the lookup hash map.
+     *
+     * @return the lookup hash map
+     */
+    public HashMap getLookupHashMap() {
+        if (this.lookupHashMap == null) {
+            this.lookupHashMap = new HashMap();
+        }
+        return this.lookupHashMap;
+    }
+
+    /**
+     * Sets the lookup hash map.
+     *
+     * @param lookupHashMap the lookup hash map
+     */
+    public void setLookupHashMap(HashMap lookupHashMap) {
+        this.lookupHashMap = lookupHashMap;
+    }
+
+    /**
+     * Gets the precheck added list.
+     *
+     * @return the precheck added list
+     */
+    public HashMap> getPrecheckAddedList() {
+        if (this.precheckAddedList == null) {
+            this.precheckAddedList = new HashMap>();
+        }
+        return precheckAddedList;
+    }
+
+    /**
+     * Sets the precheck added list.
+     *
+     * @param precheckAddedList the precheck added list
+     */
+    public void setPrecheckAddedList(HashMap> precheckAddedList) {
+        this.precheckAddedList = precheckAddedList;
+    }
+
+    /**
+     * Gets the precheck response messages.
+     *
+     * @return the precheck response messages
+     */
+    public AAIResponseMessages getPrecheckResponseMessages() {
+        if (this.precheckResponseMessages == null) {
+            this.precheckResponseMessages = new AAIResponseMessages();
+        }
+        return precheckResponseMessages;
+    }
+
+    /**
+     * Sets the precheck response messages.
+     *
+     * @param precheckResponseData the new precheck response messages
+     */
+    public void setPrecheckResponseMessages(AAIResponseMessages precheckResponseData) {
+        this.precheckResponseMessages = precheckResponseData;
+    }
+
+    /**
+     * Gets the topology.
+     *
+     * @return the topology
+     */
+    public HashMap getTopology() {
+        if (this.topology == null) {
+            this.topology = new HashMap();
+        }
+        return topology;
+    }
+
+    /**
+     * Gets the vertex cache.
+     *
+     * @return the vertex cache
+     */
+    public HashMap getVertexCache() {
+        if (this.vertexCache == null) {
+            this.vertexCache = new HashMap();
+        }
+        return vertexCache;
+    }
+
+    /**
+     * Gets the base object.
+     *
+     * @return the base object
+     */
+    public String getBaseObject() {
+        return baseObject;
+    }
+
+    /**
+     * Sets the base object.
+     *
+     * @param baseObject the new base object
+     */
+    public void setBaseObject(String baseObject) {
+        this.baseObject = baseObject;
+    }
+
+    /**
+     * Gets the namespace.
+     *
+     * @return the namespace
+     */
+    public String getNamespace() {
+        return namespace;
+    }
+
+    /**
+     * Sets the namespace.
+     *
+     * @param namespace the new namespace
+     */
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    /**
+     * Gets the full resource name.
+     *
+     * @return the full resource name
+     */
+    public String getFullResourceName() {
+        return fullResourceName;
+    }
+
+    /**
+     * Sets the full resource name.
+     *
+     * @param fullResourceName the new full resource name
+     */
+    public void setFullResourceName(String fullResourceName) {
+        this.fullResourceName = fullResourceName;
+    }
+
+    /**
+     * Gets the top object full resource name.
+     *
+     * @return the top object full resource name
+     */
+    public String getTopObjectFullResourceName() {
+        return topObjectFullResourceName;
+    }
+
+    /**
+     * Sets the top object full resource name.
+     *
+     * @param topObjectFullResourceName the new top object full resource name
+     */
+    public void setTopObjectFullResourceName(String topObjectFullResourceName) {
+        this.topObjectFullResourceName = topObjectFullResourceName;
+    }
+
+    /**
+     * Gets the uri.
+     *
+     * @return the uri
+     */
+    public String getUri() {
+        return uri;
+    }
+
+    /**
+     * Sets the uri.
+     *
+     * @param uri the new uri
+     */
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
+
+    /**
+     * Gets the api version.
+     *
+     * @return the api version
+     */
+    public String getApiVersion() {
+        return apiVersion;
+    }
+
+    /**
+     * Sets the api version.
+     *
+     * @param apiVersion the new api version
+     */
+    public void setApiVersion(String apiVersion) {
+        this.apiVersion = apiVersion;
+    }
+
+    /**
+     * Sets the notification uri.
+     *
+     * @param uri the new notification uri
+     */
+    public void setNotificationUri(String uri) {
+        this.notificationUri = uri;
+
+    }
+
+    /**
+     * Gets the notification uri.
+     *
+     * @return the notification uri
+     */
+    public String getNotificationUri() {
+        return this.notificationUri;
+
+    }
+
+    /**
+     * Gets the start time.
+     *
+     * @return the start time
+     */
+    public long getStartTime() {
+        return startTime;
+    }
+
+    /**
+     * Sets the start time.
+     *
+     * @param startTime the new start time
+     */
+    public void setStartTime(long startTime) {
+        this.startTime = startTime;
+    }
+
+    /**
+     * Gets the checkpoint time.
+     *
+     * @return the checkpoint time
+     */
+    public long getCheckpointTime() {
+        return checkpointTime;
+    }
+
+    /**
+     * Sets the checkpoint time.
+     *
+     * @param checkpointTime the new checkpoint time
+     */
+    public void setCheckpointTime(long checkpointTime) {
+        this.checkpointTime = checkpointTime;
+    }
+
+    /**
+     * Gets the jaxb context.
+     *
+     * @return the jaxb context
+     */
+    public DynamicJAXBContext getJaxbContext() {
+        return jaxbContext;
+    }
+
+    /**
+     * Sets the jaxb context.
+     *
+     * @param jaxbContext the new jaxb context
+     */
+    public void setJaxbContext(DynamicJAXBContext jaxbContext) {
+        this.jaxbContext = jaxbContext;
+    }
+
+    /**
+     * Sets the event action.
+     *
+     * @param eventAction the new event action
+     */
+    public void setEventAction(String eventAction) {
+        this.eventAction = eventAction;
+    }
+
+    /**
+     * Gets the event action.
+     *
+     * @return the event action
+     */
+    public String getEventAction() {
+        return this.eventAction;
+    }
+
+    /**
+     * Gets the transactional graph engine.
+     *
+     * @return the transactional graph engine
+     */
+    public TransactionalGraphEngine getTransactionalGraphEngine() {
+        return this.dbEngine;
+
+    }
+
+    /**
+     * Sets the transactional graph engine.
+     *
+     * @param dbEngine the new transactional graph engine
+     */
+    public void setTransactionalGraphEngine(TransactionalGraphEngine dbEngine) {
+        this.dbEngine = dbEngine;
+
+    }
+
+    /**
+     * Gets the loader.
+     *
+     * @return the loader
+     */
+    public Loader getLoader() {
+        return loader;
+    }
+
+    /**
+     * Sets the loader.
+     *
+     * @param loader the new loader
+     */
+    public void setLoader(Loader loader) {
+        this.loader = loader;
+    }
+
+    /**
+     * Gets the uri info.
+     *
+     * @return the uri info
+     */
+    public UriInfo getUriInfo() {
+        return uriInfo;
+    }
+
+    /**
+     * Sets the uri info.
+     *
+     * @param uriInfo the new uri info
+     */
+    public void setUriInfo(UriInfo uriInfo) {
+        this.uriInfo = uriInfo;
+    }
+
+    public DBRequest getDbRequest() {
+        return dbRequest;
+    }
+
+    public void setDbRequest(DBRequest dbRequest) {
+        this.dbRequest = dbRequest;
+    }
+
+    public HttpEntry getHttpEntry() {
+        return httpEntry;
+    }
+
+    public void setHttpEntry(HttpEntry httpEntry) {
+        this.httpEntry = httpEntry;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/extensions/ExtensionController.java b/aai-core/src/main/java/org/onap/aai/extensions/ExtensionController.java
index 8959a04e..13c2de94 100644
--- a/aai-core/src/main/java/org/onap/aai/extensions/ExtensionController.java
+++ b/aai-core/src/main/java/org/onap/aai/extensions/ExtensionController.java
@@ -17,128 +17,120 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.extensions;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.util.AAIConfig;
 
 import java.lang.reflect.Method;
 
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.util.AAIConfig;
+
 public class ExtensionController {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ExtensionController.class);
-
-	/**
-	 * Run extension.
-	 *
-	 * @param apiVersion the api version
-	 * @param namespace the namespace
-	 * @param resourceName the resource name
-	 * @param methodName the method name
-	 * @param aaiExtMap the aai ext map
-	 * @param isPreExtension the is pre extension
-	 * @throws AAIException the AAI exception
-	 */
-	public void runExtension(String apiVersion, String namespace,
-			String resourceName, String methodName, AAIExtensionMap aaiExtMap,
-			boolean isPreExtension) throws AAIException {
-		String extensionClassName = "org.onap.aai.extensions."
-				+ apiVersion.toLowerCase() + "." + namespace + "."
-				+ resourceName + "Extension";
-		String defaultErrorCallback = resourceName + "ExtensionErrorCallback";
-
-		String configOption = "aai.extensions." + apiVersion.toLowerCase()
-				+ "." + namespace.toLowerCase() + "."
-				+ resourceName.toLowerCase() + ".enabled";
-
-		try {
-
-			String extensionEnabled = AAIConfig.get(configOption, "true");
-			if (extensionEnabled.equalsIgnoreCase("false")) {
-				return;
-			}
-
-			Class clazz = Class.forName(extensionClassName);
-
-			Method extension = clazz.getMethod(methodName,
-					new Class[] { AAIExtensionMap.class });
-			if (extension != null) {
-
-				Object ret = extension.invoke(clazz.newInstance(), aaiExtMap);
-
-				if (ret instanceof Integer) {
-					Exception e = null;
-					
-					if (isPreExtension == true) {
-						e = aaiExtMap.getPreExtException();
-					} else {
-						e = aaiExtMap.getPostExtException();
-					}
-
-					boolean failOnError = true;
-					if (isPreExtension == true) {
-						failOnError = aaiExtMap.getPreExtFailOnError();
-					} else {
-						failOnError = aaiExtMap.getPostExtFailOnError();
-					}
-
-					if (e != null) {
-						boolean handleException = true;
-						if (isPreExtension == true) {
-							if (aaiExtMap.getPreExtSkipErrorCallback() == true) { 
-								handleException = false;
-							}
-						} else {
-							if (aaiExtMap.getPostExtSkipErrorCallback() == true) { 
-								handleException = false;
-							}
-						}
-						if (handleException == true) {
-							Method errorCallback = null;
-							if (isPreExtension == true) {
-								errorCallback = aaiExtMap
-										.getPreExtErrorCallback();
-							} else {
-								errorCallback = aaiExtMap
-										.getPostExtErrorCallback();
-							}
-
-							if (errorCallback != null) {
-								errorCallback.invoke(clazz.newInstance(),
-										aaiExtMap);
-							} else {
-								Method defaultErrorCallbackExtension = clazz
-										.getMethod(
-												defaultErrorCallback,
-												new Class[] { AAIExtensionMap.class });
-								defaultErrorCallbackExtension.invoke(
-										clazz.newInstance(), aaiExtMap);
-							}
-						}
-					}
-
-					if (failOnError == true && e != null) {
-						throw e;
-					} else if (failOnError == false && e != null) { // in this
-																	// case, we
-																	// just note
-																	// the error
-																	// without
-																	// stopping
-						LOGGER.warn("Error while processing extension - " + aaiExtMap.getMessage());
-					}
-				}
-			}
-		} catch (ClassNotFoundException ex) {
-			LOGGER.debug("Extension class not found: " + extensionClassName + ", method: " + methodName + ".");
-		} catch (NoSuchMethodException e) {
-			LOGGER.debug("Method " + methodName + " does not exist for class " + extensionClassName); 
-		} catch (AAIException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new AAIException("AAI_5105", e);
-		} 
-	}
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ExtensionController.class);
+
+    /**
+     * Run extension.
+     *
+     * @param apiVersion the api version
+     * @param namespace the namespace
+     * @param resourceName the resource name
+     * @param methodName the method name
+     * @param aaiExtMap the aai ext map
+     * @param isPreExtension the is pre extension
+     * @throws AAIException the AAI exception
+     */
+    public void runExtension(String apiVersion, String namespace, String resourceName, String methodName,
+            AAIExtensionMap aaiExtMap, boolean isPreExtension) throws AAIException {
+        String extensionClassName = "org.onap.aai.extensions." + apiVersion.toLowerCase() + "." + namespace + "."
+                + resourceName + "Extension";
+        String defaultErrorCallback = resourceName + "ExtensionErrorCallback";
+
+        String configOption = "aai.extensions." + apiVersion.toLowerCase() + "." + namespace.toLowerCase() + "."
+                + resourceName.toLowerCase() + ".enabled";
+
+        try {
+
+            String extensionEnabled = AAIConfig.get(configOption, "true");
+            if (extensionEnabled.equalsIgnoreCase("false")) {
+                return;
+            }
+
+            Class clazz = Class.forName(extensionClassName);
+
+            Method extension = clazz.getMethod(methodName, new Class[] {AAIExtensionMap.class});
+            if (extension != null) {
+
+                Object ret = extension.invoke(clazz.newInstance(), aaiExtMap);
+
+                if (ret instanceof Integer) {
+                    Exception e = null;
+
+                    if (isPreExtension == true) {
+                        e = aaiExtMap.getPreExtException();
+                    } else {
+                        e = aaiExtMap.getPostExtException();
+                    }
+
+                    boolean failOnError = true;
+                    if (isPreExtension == true) {
+                        failOnError = aaiExtMap.getPreExtFailOnError();
+                    } else {
+                        failOnError = aaiExtMap.getPostExtFailOnError();
+                    }
+
+                    if (e != null) {
+                        boolean handleException = true;
+                        if (isPreExtension == true) {
+                            if (aaiExtMap.getPreExtSkipErrorCallback() == true) {
+                                handleException = false;
+                            }
+                        } else {
+                            if (aaiExtMap.getPostExtSkipErrorCallback() == true) {
+                                handleException = false;
+                            }
+                        }
+                        if (handleException == true) {
+                            Method errorCallback = null;
+                            if (isPreExtension == true) {
+                                errorCallback = aaiExtMap.getPreExtErrorCallback();
+                            } else {
+                                errorCallback = aaiExtMap.getPostExtErrorCallback();
+                            }
+
+                            if (errorCallback != null) {
+                                errorCallback.invoke(clazz.newInstance(), aaiExtMap);
+                            } else {
+                                Method defaultErrorCallbackExtension =
+                                        clazz.getMethod(defaultErrorCallback, new Class[] {AAIExtensionMap.class});
+                                defaultErrorCallbackExtension.invoke(clazz.newInstance(), aaiExtMap);
+                            }
+                        }
+                    }
+
+                    if (failOnError == true && e != null) {
+                        throw e;
+                    } else if (failOnError == false && e != null) { // in this
+                                                                    // case, we
+                                                                    // just note
+                                                                    // the error
+                                                                    // without
+                                                                    // stopping
+                        LOGGER.warn("Error while processing extension - " + aaiExtMap.getMessage());
+                    }
+                }
+            }
+        } catch (ClassNotFoundException ex) {
+            LOGGER.debug("Extension class not found: " + extensionClassName + ", method: " + methodName + ".");
+        } catch (NoSuchMethodException e) {
+            LOGGER.debug("Method " + methodName + " does not exist for class " + extensionClassName);
+        } catch (AAIException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new AAIException("AAI_5105", e);
+        }
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/extensions/OrphanLInterfaceHandler.java b/aai-core/src/main/java/org/onap/aai/extensions/OrphanLInterfaceHandler.java
index 128945d3..094e7cee 100644
--- a/aai-core/src/main/java/org/onap/aai/extensions/OrphanLInterfaceHandler.java
+++ b/aai-core/src/main/java/org/onap/aai/extensions/OrphanLInterfaceHandler.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.extensions;
 
 import java.io.UnsupportedEncodingException;
@@ -26,6 +27,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -34,77 +36,80 @@ import org.onap.aai.parsers.query.QueryParser;
 import org.onap.aai.query.builder.QueryBuilder;
 import org.onap.aai.rest.db.DBRequest;
 import org.onap.aai.restcore.HttpMethod;
-import org.onap.aai.edges.enums.EdgeType;
 
 public class OrphanLInterfaceHandler {
-	
-	private QueryBuilder createLInterfaceQuery(AAIExtensionMap aaiReqMap, Introspector newvceObj) throws AAIException {
-		Introspector uplinkLInterfaceTraversalIntro = aaiReqMap.getLoader().introspectorFromName("l-interface");
-		
-		Introspector customerUplinkLInterfaceTraversalIntro = aaiReqMap.getLoader().introspectorFromName("l-interface");
-		
-		Introspector logLinkIntroForTraversal = aaiReqMap.getLoader().introspectorFromName("logical-link");
-		
-		QueryBuilder query = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder()
-										.exactMatchQuery(newvceObj)
-										.createEdgeTraversal(EdgeType.TREE, newvceObj, uplinkLInterfaceTraversalIntro)
-										.getVerticesByProperty("interface-role", "UPLINK")
-										.createEdgeTraversal(EdgeType.COUSIN, uplinkLInterfaceTraversalIntro, logLinkIntroForTraversal)
-										.createEdgeTraversal(EdgeType.COUSIN, logLinkIntroForTraversal, customerUplinkLInterfaceTraversalIntro)
-										.getVerticesByProperty("interface-role", "CUSTOMER-UPLINK").dedup();
-		return query;
-	}
-	
-	private URI buildLInterfaceURI(Vertex linterface, AAIExtensionMap aaiReqMap) throws UnsupportedEncodingException, AAIException, URISyntaxException {
-		Loader loader = aaiReqMap.getLoader();
-		Introspector lint = loader.introspectorFromName("l-interface");
-		lint.setValue("interface-name", (String)linterface.property("interface-name").value());
-		String lintSegment = lint.getURI();
-		
-		Introspector lagInterfaceForTrav = loader.introspectorFromName("lag-interface");
-		QueryBuilder lagIntQuery = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder()
-										.exactMatchQuery(lint)
-										.createEdgeTraversal(EdgeType.TREE, linterface, lagInterfaceForTrav).dedup();
-		List lagInterfaces = lagIntQuery.toList();
-		if (lagInterfaces.isEmpty()) {
-			throw new AAIException("AAI_6114");
-		} else if (lagInterfaces.size() > 1) {
-			throw new AAIException("AAI_6140");
-		}
-		Vertex lagInt = lagInterfaces.get(0);
-		lagInterfaceForTrav.setValue("interface-name", (String)lagInt.property("interface-name").value());
-		String lagSegment = lagInterfaceForTrav.getURI();
-		
-		Introspector gvVPEforTrav = loader.introspectorFromName("generic-vnf");
-		QueryBuilder gvVPEquery = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder()
-										.exactMatchQuery(lagInterfaceForTrav)
-										.createEdgeTraversal(EdgeType.TREE, lagInterfaceForTrav, gvVPEforTrav).dedup();
-		List genvnfs = gvVPEquery.toList();
-		if (genvnfs.isEmpty()) {
-			throw new AAIException("AAI_6114");
-		} else if (genvnfs.size() > 1) {
-			throw new AAIException("AAI_6140");
-		}
-		Vertex genvnf = genvnfs.get(0);
-		gvVPEforTrav.setValue("vnf-id", (String)genvnf.property("vnf-id").value());
-		String gvSegment = gvVPEforTrav.getURI();
-		
-		return new URI(gvSegment + lagSegment + lintSegment);
-	}
 
-	public List createOrphanLInterfaceDelRequests(AAIExtensionMap aaiReqMap, Introspector newvce) throws AAIException, UnsupportedEncodingException, URISyntaxException{
-		List requests = new ArrayList<>();
-		QueryBuilder query = createLInterfaceQuery(aaiReqMap, newvce);
-		List linterfaces = query.toList();
-		
-		for (Vertex lint : linterfaces) {
-			URI lintURI = buildLInterfaceURI(lint, aaiReqMap);
-			QueryParser parser = createLInterfaceQuery(aaiReqMap, newvce).createQueryFromObjectName("l-interface");
-			DBRequest originalDbRequest = aaiReqMap.getDbRequest();
-			DBRequest request = new DBRequest.Builder(HttpMethod.DELETE, lintURI, parser, newvce, originalDbRequest.getHeaders(), originalDbRequest.getInfo(), originalDbRequest.getTransactionId()).build();
-			requests.add(request);
-		}
-		
-		return requests;
-	}
+    private QueryBuilder createLInterfaceQuery(AAIExtensionMap aaiReqMap, Introspector newvceObj)
+            throws AAIException {
+        Introspector uplinkLInterfaceTraversalIntro = aaiReqMap.getLoader().introspectorFromName("l-interface");
+
+        Introspector customerUplinkLInterfaceTraversalIntro = aaiReqMap.getLoader().introspectorFromName("l-interface");
+
+        Introspector logLinkIntroForTraversal = aaiReqMap.getLoader().introspectorFromName("logical-link");
+
+        QueryBuilder query = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder()
+                .exactMatchQuery(newvceObj)
+                .createEdgeTraversal(EdgeType.TREE, newvceObj, uplinkLInterfaceTraversalIntro)
+                .getVerticesByProperty("interface-role", "UPLINK")
+                .createEdgeTraversal(EdgeType.COUSIN, uplinkLInterfaceTraversalIntro, logLinkIntroForTraversal)
+                .createEdgeTraversal(EdgeType.COUSIN, logLinkIntroForTraversal, customerUplinkLInterfaceTraversalIntro)
+                .getVerticesByProperty("interface-role", "CUSTOMER-UPLINK").dedup();
+        return query;
+    }
+
+    private URI buildLInterfaceURI(Vertex linterface, AAIExtensionMap aaiReqMap)
+            throws UnsupportedEncodingException, AAIException, URISyntaxException {
+        Loader loader = aaiReqMap.getLoader();
+        Introspector lint = loader.introspectorFromName("l-interface");
+        lint.setValue("interface-name", (String) linterface.property("interface-name").value());
+        String lintSegment = lint.getURI();
+
+        Introspector lagInterfaceForTrav = loader.introspectorFromName("lag-interface");
+        QueryBuilder lagIntQuery = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder()
+                .exactMatchQuery(lint).createEdgeTraversal(EdgeType.TREE, linterface, lagInterfaceForTrav).dedup();
+        List lagInterfaces = lagIntQuery.toList();
+        if (lagInterfaces.isEmpty()) {
+            throw new AAIException("AAI_6114");
+        } else if (lagInterfaces.size() > 1) {
+            throw new AAIException("AAI_6140");
+        }
+        Vertex lagInt = lagInterfaces.get(0);
+        lagInterfaceForTrav.setValue("interface-name", (String) lagInt.property("interface-name").value());
+        String lagSegment = lagInterfaceForTrav.getURI();
+
+        Introspector gvVPEforTrav = loader.introspectorFromName("generic-vnf");
+        QueryBuilder gvVPEquery =
+                aaiReqMap.getTransactionalGraphEngine().getQueryBuilder().exactMatchQuery(lagInterfaceForTrav)
+                        .createEdgeTraversal(EdgeType.TREE, lagInterfaceForTrav, gvVPEforTrav).dedup();
+        List genvnfs = gvVPEquery.toList();
+        if (genvnfs.isEmpty()) {
+            throw new AAIException("AAI_6114");
+        } else if (genvnfs.size() > 1) {
+            throw new AAIException("AAI_6140");
+        }
+        Vertex genvnf = genvnfs.get(0);
+        gvVPEforTrav.setValue("vnf-id", (String) genvnf.property("vnf-id").value());
+        String gvSegment = gvVPEforTrav.getURI();
+
+        return new URI(gvSegment + lagSegment + lintSegment);
+    }
+
+    public List createOrphanLInterfaceDelRequests(AAIExtensionMap aaiReqMap, Introspector newvce)
+            throws AAIException, UnsupportedEncodingException, URISyntaxException {
+        List requests = new ArrayList<>();
+        QueryBuilder query = createLInterfaceQuery(aaiReqMap, newvce);
+        List linterfaces = query.toList();
+
+        for (Vertex lint : linterfaces) {
+            URI lintURI = buildLInterfaceURI(lint, aaiReqMap);
+            QueryParser parser = createLInterfaceQuery(aaiReqMap, newvce).createQueryFromObjectName("l-interface");
+            DBRequest originalDbRequest = aaiReqMap.getDbRequest();
+            DBRequest request =
+                    new DBRequest.Builder(HttpMethod.DELETE, lintURI, parser, newvce, originalDbRequest.getHeaders(),
+                            originalDbRequest.getInfo(), originalDbRequest.getTransactionId()).build();
+            requests.add(request);
+        }
+
+        return requests;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/ingestModel/CreateWidgetModels.java b/aai-core/src/main/java/org/onap/aai/ingestModel/CreateWidgetModels.java
index 5f641025..62cadab3 100644
--- a/aai-core/src/main/java/org/onap/aai/ingestModel/CreateWidgetModels.java
+++ b/aai-core/src/main/java/org/onap/aai/ingestModel/CreateWidgetModels.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.ingestModel;
 
 import java.io.File;
@@ -42,116 +43,115 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
 /**
  * The Class CreateWidgetModels.
  */
-public class CreateWidgetModels
-{
-	/**
-	 * The main method.
-	 *
-	 * @param args the arguments
-	 * @throws Exception the exception
-	 */
-	public static void main(String[] args) throws Exception {
-
-		String _apiVersion = AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP);
-		String widgetJsonDir = null;
-		String modelVersion = null;
-		if (args.length > 0) { 
-			if (args[0] != null) {
-				_apiVersion = args[0];
-			}
-			if (args[1] != null) { 
-				widgetJsonDir = args[1];
-			}
-			if (args[2] != null) { 
-				modelVersion = args[2];
-			}
-		}
-
-		if (widgetJsonDir == null) { 
-			System.err.println("You must specify a directory for widgetModelJson");
-			System.exit(0);
-		}
-		if (modelVersion == null) { 
-			System.err.println("You must specify a modelVersion");
-			System.exit(0);
-		}
-
-		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
-				"org.onap.aai.config",
-				"org.onap.aai.setup"
-		);
-
-		LoaderFactory loaderFactory = ctx.getBean(LoaderFactory.class);
-		Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, new SchemaVersion(_apiVersion));
-
-		// iterate the collection of resources
-
-		ArrayList processedWidgets = new ArrayList();
-		for (Entry aaiResEnt : loader.getAllObjects().entrySet()) {
-			Introspector meObject = loader.introspectorFromName("model");
-			// no need for a ModelVers DynamicEntity
-
-			Introspector aaiRes = aaiResEnt.getValue();
-
-			if (!(aaiRes.isContainer() || aaiRes.getName().equals("aai-internal"))) {
-				String resource = aaiRes.getName();
-
-				if (processedWidgets.contains(resource)) {
-					continue;
-				}
-
-				Set introspectorProperties = aaiRes.getProperties();
-
-				if(!(introspectorProperties.contains("model-version-id") && introspectorProperties.contains("model-invariant-id"))){
-				    System.out.println(aaiRes.getDbName() + " does not contain model properties so skipping");
-				}
-				processedWidgets.add(resource);
-
-				String widgetName = resource;
-				String filePathString = widgetJsonDir + "/" + widgetName + "-" + modelVersion + ".json";
-				File f = new File(filePathString);
-
-				String filePathString2 = widgetJsonDir + "/../widget-model-json-old/" + widgetName + "-" + modelVersion + ".json";
-				File f2 = new File(filePathString2);
-
-				if(!f.exists() && !f.isDirectory()) { 
-
-					if (f2.exists()) { 
-						System.out.println("Using old file for " + resource + ".");
-
-						meObject = loader.unmarshal("model", new StreamSource(f2).getReader().toString());
-						// override, some of them are wrong
-						meObject.setValue("model-version", modelVersion);
-					} else {
-						System.out.println("Making new file for " + resource + ".");
-						meObject.setValue("model-invariant-id", UUID.randomUUID().toString());
-						meObject.setValue("model-type", "widget");
-						Introspector mevObject = loader.introspectorFromName("model-ver");
-						Introspector mevsObject = loader.introspectorFromName("model-vers");
-						mevObject.setValue("model-version-id", UUID.randomUUID().toString());
-						mevObject.setValue("model-version", modelVersion);
-						mevObject.setValue("model-Name", widgetName);
-						// make a list of dynamic Entities
-						List mevsList = new ArrayList<>();
-						// add this one, it will be the only one in the list in this case
-						mevsList.add(mevObject.getUnderlyingObject());
-						mevsObject.setValue("model-ver", mevsList);
-						// Have to figure out how to add my mev object to the mevsObject, 
-						// the modelVers is a list of dynamic entities so we can just attach the array here
-						meObject.setValue("model-vers",mevsObject.getUnderlyingObject());
-					}
-
-					// put it out as JSON
-
-					PrintWriter out = new PrintWriter(f);
-					out.println(meObject.marshal(true));
-					out.close();
-
-				} else { 
-					System.out.println("File already exists for " + resource + ".  Skipping.");
-				}
-			}
-		}
-		System.exit(0);
-	}
+public class CreateWidgetModels {
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     * @throws Exception the exception
+     */
+    public static void main(String[] args) throws Exception {
+
+        String _apiVersion = AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP);
+        String widgetJsonDir = null;
+        String modelVersion = null;
+        if (args.length > 0) {
+            if (args[0] != null) {
+                _apiVersion = args[0];
+            }
+            if (args[1] != null) {
+                widgetJsonDir = args[1];
+            }
+            if (args[2] != null) {
+                modelVersion = args[2];
+            }
+        }
+
+        if (widgetJsonDir == null) {
+            System.err.println("You must specify a directory for widgetModelJson");
+            System.exit(0);
+        }
+        if (modelVersion == null) {
+            System.err.println("You must specify a modelVersion");
+            System.exit(0);
+        }
+
+        AnnotationConfigApplicationContext ctx =
+                new AnnotationConfigApplicationContext("org.onap.aai.config", "org.onap.aai.setup");
+
+        LoaderFactory loaderFactory = ctx.getBean(LoaderFactory.class);
+        Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, new SchemaVersion(_apiVersion));
+
+        // iterate the collection of resources
+
+        ArrayList processedWidgets = new ArrayList();
+        for (Entry aaiResEnt : loader.getAllObjects().entrySet()) {
+            Introspector meObject = loader.introspectorFromName("model");
+            // no need for a ModelVers DynamicEntity
+
+            Introspector aaiRes = aaiResEnt.getValue();
+
+            if (!(aaiRes.isContainer() || aaiRes.getName().equals("aai-internal"))) {
+                String resource = aaiRes.getName();
+
+                if (processedWidgets.contains(resource)) {
+                    continue;
+                }
+
+                Set introspectorProperties = aaiRes.getProperties();
+
+                if (!(introspectorProperties.contains("model-version-id")
+                        && introspectorProperties.contains("model-invariant-id"))) {
+                    System.out.println(aaiRes.getDbName() + " does not contain model properties so skipping");
+                }
+                processedWidgets.add(resource);
+
+                String widgetName = resource;
+                String filePathString = widgetJsonDir + "/" + widgetName + "-" + modelVersion + ".json";
+                File f = new File(filePathString);
+
+                String filePathString2 =
+                        widgetJsonDir + "/../widget-model-json-old/" + widgetName + "-" + modelVersion + ".json";
+                File f2 = new File(filePathString2);
+
+                if (!f.exists() && !f.isDirectory()) {
+
+                    if (f2.exists()) {
+                        System.out.println("Using old file for " + resource + ".");
+
+                        meObject = loader.unmarshal("model", new StreamSource(f2).getReader().toString());
+                        // override, some of them are wrong
+                        meObject.setValue("model-version", modelVersion);
+                    } else {
+                        System.out.println("Making new file for " + resource + ".");
+                        meObject.setValue("model-invariant-id", UUID.randomUUID().toString());
+                        meObject.setValue("model-type", "widget");
+                        Introspector mevObject = loader.introspectorFromName("model-ver");
+                        Introspector mevsObject = loader.introspectorFromName("model-vers");
+                        mevObject.setValue("model-version-id", UUID.randomUUID().toString());
+                        mevObject.setValue("model-version", modelVersion);
+                        mevObject.setValue("model-Name", widgetName);
+                        // make a list of dynamic Entities
+                        List mevsList = new ArrayList<>();
+                        // add this one, it will be the only one in the list in this case
+                        mevsList.add(mevObject.getUnderlyingObject());
+                        mevsObject.setValue("model-ver", mevsList);
+                        // Have to figure out how to add my mev object to the mevsObject,
+                        // the modelVers is a list of dynamic entities so we can just attach the array here
+                        meObject.setValue("model-vers", mevsObject.getUnderlyingObject());
+                    }
+
+                    // put it out as JSON
+
+                    PrintWriter out = new PrintWriter(f);
+                    out.println(meObject.marshal(true));
+                    out.close();
+
+                } else {
+                    System.out.println("File already exists for " + resource + ".  Skipping.");
+                }
+            }
+        }
+        System.exit(0);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/Introspector.java b/aai-core/src/main/java/org/onap/aai/introspection/Introspector.java
index 21299f79..9e599a64 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/Introspector.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/Introspector.java
@@ -17,11 +17,18 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.google.common.base.CaseFormat;
+
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.*;
+import java.util.stream.Collectors;
+
 import org.apache.commons.lang.ClassUtils;
 import org.eclipse.persistence.exceptions.DynamicException;
 import org.onap.aai.config.SpringContextAware;
@@ -36,608 +43,615 @@ import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.workarounds.NamingExceptions;
 
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.*;
-import java.util.stream.Collectors;
-
-
 public abstract class Introspector implements Cloneable {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(Introspector.class);
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(Introspector.class);
 
-	protected String className;
-	protected String uriChain = "";
-	protected Loader loader;
-	protected final NamingExceptions namingException = NamingExceptions.getInstance();
-	private Set uniqueProperties = null;
-	private Set indexedProperties = null;
-	private Set allKeys = null;
+    protected String className;
+    protected String uriChain = "";
+    protected Loader loader;
+    protected final NamingExceptions namingException = NamingExceptions.getInstance();
+    private Set uniqueProperties = null;
+    private Set indexedProperties = null;
+    private Set allKeys = null;
 
     protected CaseFormatStore caseFormatStore = null;
     protected NodeIngestor nodeIngestor;
 
-	protected Introspector(Object obj) {
-        this.nodeIngestor    = SpringContextAware.getBean(NodeIngestor.class);
+    protected Introspector(Object obj) {
+        this.nodeIngestor = SpringContextAware.getBean(NodeIngestor.class);
         this.caseFormatStore = nodeIngestor.getCaseFormatStore();
-	}
+    }
+
+    public abstract boolean hasProperty(String name);
+
+    protected String convertPropertyName(String name) {
+        return caseFormatStore.fromLowerHyphenToLowerCamel(name).orElseGet(() -> {
+            LOGGER.debug("Unable to find {} in the store from lower hyphen to lower camel", name);
+            return CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, name);
+        });
+    }
 
-	public abstract boolean hasProperty(String name);
+    protected abstract Object get(String name);
+
+    protected abstract void set(String name, Object value);
+
+    /**
+     *
+     * @param name the property name you'd like to retrieve the value for
+     * @return the value of the property
+     */
+    public  T getValue(String name) {
+        String convertedName = convertPropertyName(name);
+        Object result = null;
+
+        if (this.hasProperty(name)) {
+            result = this.get(convertedName);
+        } else {
+            /* property not found - slightly ambiguous */
+            return null;
+        }
+
+        Class clazz = this.getClass(name);
+        if (this.isListType(name) && result == null) {
+            try {
+                this.set(convertedName, clazz.newInstance());
+                result = this.get(convertedName);
+            } catch (DynamicException | InstantiationException | IllegalAccessException e) {
+                LOGGER.warn(e.getMessage(), e);
+            }
+        }
+
+        return (T) result;
+    }
+
+    public Introspector getWrappedValue(String name) {
+        String convertedName = convertPropertyName(name);
+        Object value = null;
+
+        if (this.hasProperty(name)) {
+            value = this.get(convertedName);
+        } else {
+            /* property not found - slightly ambiguous */
+            return null;
+        }
+
+        Class clazz = this.getClass(name);
+        if (this.isListType(name) && value == null) {
+            try {
+                this.set(convertedName, clazz.newInstance());
+                value = this.get(convertedName);
+            } catch (DynamicException | InstantiationException | IllegalAccessException e) {
+                LOGGER.warn(e.getMessage(), e);
+            }
+        }
+        if (value != null) {
+            return IntrospectorFactory.newInstance(this.getModelType(), value);
+        } else {
+            // no value
+            return null;
+        }
+
+    }
+
+    public List getWrappedListValue(String name) {
+        String convertedName = convertPropertyName(name);
+        Object value = null;
+        List resultList = new ArrayList<>();
+        if (this.hasProperty(name)) {
+            value = this.get(convertedName);
+        } else {
+            /* property not found - slightly ambiguous */
+            return null;
+        }
+        boolean isListType = this.isListType(name);
+        if (!this.isListType(name)) {
+            return null;
+        }
+        Class clazz = this.getClass(name);
+        if (isListType && value == null) {
+            try {
+                this.set(convertedName, clazz.newInstance());
+                value = this.get(convertedName);
+            } catch (DynamicException | InstantiationException | IllegalAccessException e) {
+                LOGGER.warn(e.getMessage(), e);
+            }
+        }
+
+        List valueList = (List) value;
+
+        for (Object item : valueList) {
+            resultList.add(IntrospectorFactory.newInstance(this.getModelType(), item));
+        }
+
+        return resultList;
 
-	protected String convertPropertyName (String name) {
-	    return caseFormatStore
-            .fromLowerHyphenToLowerCamel(name)
-            .orElseGet(
-                () -> {
-                    LOGGER.debug("Unable to find {} in the store from lower hyphen to lower camel", name);
-                    return CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, name);
+    }
+
+    public Object castValueAccordingToSchema(String name, Object obj) {
+        Object result = obj;
+        Class nameClass = this.getClass(name);
+        if (nameClass == null) {
+            throw new IllegalArgumentException("property: " + name + " does not exist on " + this.getDbName());
+        }
+        if (obj != null) {
+
+            try {
+                if (!obj.getClass().getName().equals(nameClass.getName())) {
+                    if (nameClass.isPrimitive()) {
+                        nameClass = ClassUtils.primitiveToWrapper(nameClass);
+                        result = nameClass.getConstructor(String.class).newInstance(obj.toString());
+                    }
+                    if (obj instanceof String) {
+                        result = nameClass.getConstructor(String.class).newInstance(obj);
+                    } else if (!this.isListType(name) && !this.isComplexType(name)) {
+                        // box = obj.toString();
+                        result = nameClass.getConstructor(String.class).newInstance(obj.toString());
+                    }
                 }
-            );
-	}
-
-	protected abstract Object get(String name);
-	protected abstract void set(String name, Object value);
-	/**
-	 *
-	 * @param name the property name you'd like to retrieve the value for
-	 * @return the value of the property
-	 */
-	public  T getValue(String name) {
-		String convertedName = convertPropertyName(name);
-		Object result = null;
-
-		if (this.hasProperty(name)) {
-			result = this.get(convertedName);
-		} else {
-			/* property not found - slightly ambiguous */
-			return null;
-		}
-
-		Class clazz = this.getClass(name);
-		if (this.isListType(name) && result == null) {
-			try {
-				this.set(convertedName, clazz.newInstance());
-				result = this.get(convertedName);
-			} catch (DynamicException | InstantiationException | IllegalAccessException e) {
-				LOGGER.warn(e.getMessage(),e);
-			}
-		}
-
-		return (T)result;
-	}
-
-	public Introspector getWrappedValue(String name) {
-		String convertedName = convertPropertyName(name);
-		Object value = null;
-
-		if (this.hasProperty(name)) {
-			value = this.get(convertedName);
-		} else {
-			/* property not found - slightly ambiguous */
-			return null;
-		}
-
-		Class clazz = this.getClass(name);
-		if (this.isListType(name) && value == null) {
-			try {
-				this.set(convertedName, clazz.newInstance());
-				value = this.get(convertedName);
-			} catch (DynamicException | InstantiationException | IllegalAccessException e) {
-				LOGGER.warn(e.getMessage(),e);
-			}
-		}
-		if (value != null) {
-			return IntrospectorFactory.newInstance(this.getModelType(), value);
-		} else {
-			//no value
-			return null;
-		}
-
-	}
-
-	public List getWrappedListValue(String name) {
-		String convertedName = convertPropertyName(name);
-		Object value = null;
-		List resultList = new ArrayList<>();
-		if (this.hasProperty(name)) {
-			value = this.get(convertedName);
-		} else {
-			/* property not found - slightly ambiguous */
-			return null;
-		}
-		boolean isListType = this.isListType(name);
-		if (!this.isListType(name)) {
-			return null;
-		}
-		Class clazz = this.getClass(name);
-		if (isListType && value == null) {
-			try {
-				this.set(convertedName, clazz.newInstance());
-				value = this.get(convertedName);
-			} catch (DynamicException | InstantiationException | IllegalAccessException e) {
-				LOGGER.warn(e.getMessage(),e);
-			}
-		}
-
-		List valueList = (List)value;
-
-		for (Object item : valueList) {
-			resultList.add(IntrospectorFactory.newInstance(this.getModelType(), item));
-		}
-
-		return resultList;
-
-	}
-
-	public Object castValueAccordingToSchema(String name, Object obj) {
-		Object result = obj;
-		Class nameClass = this.getClass(name);
-		if (nameClass == null) {
-			throw new IllegalArgumentException("property: " + name + " does not exist on " + this.getDbName());
-		}
-		if (obj != null) {
-
-			try {
-				if (!obj.getClass().getName().equals(nameClass.getName())) {
-					if (nameClass.isPrimitive()) {
-						nameClass = ClassUtils.primitiveToWrapper(nameClass);
-						result = nameClass.getConstructor(String.class).newInstance(obj.toString());
-					}
-					if (obj instanceof String) {
-						result = nameClass.getConstructor(String.class).newInstance(obj);
-					} else if (!this.isListType(name) && !this.isComplexType(name)){
-						//box = obj.toString();
-						result = nameClass.getConstructor(String.class).newInstance(obj.toString());
-					}
-				}
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
-					| InvocationTargetException | NoSuchMethodException | SecurityException e) {
-				ErrorLogHelper.logError("AAI_4017", e.getMessage());
-			}
-		}
-		return result;
-	}
-
-	public List castValueAccordingToSchema(String name, List objs) {
-		List result = new ArrayList<>();
-
-		for (Object item : objs) {
-			result.add(this.castValueAccordingToSchema(name, item));
-		}
-
-		return result;
-
-	}
-	/**
-	 *
-	 * @param name the property name you'd like to set the value of
-	 * @param obj the value to be set
-	 * @return
-	 */
-	public void setValue(String name, Object obj) {
-		Object box = this.castValueAccordingToSchema(name, obj);
-
-		name = convertPropertyName(name);
-		this.set(name, box);
-	}
-	/**
-	 *
-	 * @return a list of all the properties available on the object
-	 */
-	public abstract Set getProperties();
-
-	public Set getProperties(PropertyPredicate p) {
-		final Set temp = new LinkedHashSet<>();
-		this.getProperties().stream().filter(item -> {
-			return p.test(this, item);
-		}).forEach(item -> {
-			temp.add(item);
-		});
-		final Set result = Collections.unmodifiableSet(temp);
-
-		return result;
-
-	}
-
-	public Set getSimpleProperties(PropertyPredicate p){
-        return this.getProperties()
-            .stream()
-            .filter(item -> p.test(this, item))
-            .filter(this::isSimpleType)
-            .collect(Collectors.toSet());
-    }
-	/**
-	 *
-	 * @return a list of the required properties on the object
-	 */
-	public abstract Set getRequiredProperties();
-	/**
-	 *
-	 * @return a list of the properties that can be used to query the object in the db
-	 */
-	public abstract Set getKeys();
-	/**
-	 *
-	 * @return a list of the all key properties for this object
-	 */
-	public Set getAllKeys() {
-		Set result = null;
-		if (this.allKeys == null) {
-			Set keys = this.getKeys();
-			result = new LinkedHashSet<>();
-			result.addAll(keys);
-			String altKeys = this.getMetadata(ObjectMetadata.ALTERNATE_KEYS_1);
-			if (altKeys != null) {
-				String[] altKeysArray = altKeys.split(",");
-				for (String altKey : altKeysArray) {
-					result.add(altKey);
-				}
-			}
-			result = Collections.unmodifiableSet(result);
-			this.allKeys = result;
-		}
-		result = this.allKeys;
-		return result;
-	}
-
-	public Set getIndexedProperties() {
-		Set result = null;
-
-		if (this.indexedProperties == null) {
-			result = new LinkedHashSet<>();
-			Set keys = this.getKeys();
-			result.addAll(keys);
-			String altKeys = this.getMetadata(ObjectMetadata.INDEXED_PROPS);
-			if (altKeys != null) {
-				String[] altKeysArray = altKeys.split(",");
-				for (String altKey : altKeysArray) {
-					result.add(altKey);
-				}
-			}
-			this.indexedProperties = Collections.unmodifiableSet(result);
-		}
-		result = this.indexedProperties;
-		return result;
-	}
-
-	public Set getUniqueProperties() {
-		Set result = null;
-		if (this.uniqueProperties == null) {
-			String altKeys = this.getMetadata(ObjectMetadata.UNIQUE_PROPS);
-			result = new LinkedHashSet<>();
-			if (altKeys != null) {
-				String[] altKeysArray = altKeys.split(",");
-				for (String altKey : altKeysArray) {
-					result.add(altKey);
-				}
-			}
-			this.uniqueProperties = Collections.unmodifiableSet(result);
-
-		}
-		result = this.uniqueProperties;
-		return result;
-	}
-
-	public Set getDependentOn() {
-		String dependentOn = this.getMetadata(ObjectMetadata.DEPENDENT_ON);
-		if (dependentOn == null) {
-			return  new LinkedHashSet<>();
-		}
-		return new LinkedHashSet<>(Arrays.asList(dependentOn.split(",")));
-	}
-	/**
-	 *
-	 * @param name
-	 * @return the string name of the java class of the named property
-	 */
-	public String getType(String name) {
-		Class resultClass = this.getClass(name);
-		String result = "";
-
-		if (resultClass != null) {
-			result = resultClass.getName();
-			if (result.equals("java.util.ArrayList")) {
-				result = "java.util.List";
-			}
-		}
-
-		return result;
-	}
-	/**
-	 * This will returned the generic parameterized type of the underlying
-	 * object if it exists
-	 * @param name
-	 * @return the generic type of the java class of the underlying object
-	 */
-	public String getGenericType(String name) {
-		Class resultClass = this.getGenericTypeClass(name);
-		String result = "";
-
-		if (resultClass != null) {
-			result = resultClass.getName();
-		}
-
-		return result;
-	}
-	/**
-	 *
-	 * @return the string name of the java class of the underlying object
-	 */
-	public abstract String getJavaClassName();
-
-	/**
-	 *
-	 * @param name the property name
-	 * @return the Class object
-	 */
-	public abstract Class getClass(String name);
-
-	public abstract Class getGenericTypeClass(String name);
-
-	/**
-	 *
-	 * @param name the property name
-	 * @return a new instance of the underlying type of this property
-	 * @throws AAIUnknownObjectException
-	 */
-	public Object newInstanceOfProperty(String name) throws AAIUnknownObjectException {
-		String type = this.getType(name);
-		return loader.objectFromName(type);
-	}
-
-	public Object newInstanceOfNestedProperty(String name) throws AAIUnknownObjectException {
-		String type = this.getGenericType(name);
-		return loader.objectFromName(type);
-	}
-
-
-	public Introspector newIntrospectorInstanceOfProperty(String name) throws AAIUnknownObjectException {
-
-		Introspector result = IntrospectorFactory.newInstance(this.getModelType(), this.newInstanceOfProperty(name));
-
-		return result;
-
-	}
-
-	public Introspector newIntrospectorInstanceOfNestedProperty(String name) throws AAIUnknownObjectException {
-
-		Introspector result = IntrospectorFactory.newInstance(this.getModelType(), this.newInstanceOfNestedProperty(name));
-
-		return result;
-
-	}
-	/**
-	 * Is this type not a Java String or primitive
-	 * @param name
-	 * @return
-	 */
-	public boolean isComplexType(String name) {
-		String result = this.getType(name);
-
-		if (result.contains("aai") || result.equals("java.lang.Object")) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	public boolean isComplexGenericType(String name) {
-		String result = this.getGenericType(name);
-
-		if (result.contains("aai")) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	public boolean isSimpleType(String name) {
-		return !(this.isComplexType(name) || this.isListType(name));
-	}
-
-	public boolean isSimpleGenericType(String name) {
-		return !this.isComplexGenericType(name);
-	}
-
-	public boolean isListType(String name) {
-		String result = this.getType(name);
-
-		if (result.contains("java.util.List")) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	public boolean isContainer() {
-		Set props = this.getProperties();
-		boolean result = false;
-		if (props.size() == 1 && this.isListType(props.iterator().next())) {
-			result = true;
-		}
-
-		return result;
-	}
-
-	public abstract String getChildName();
-	public String getChildDBName() {
-		String result = this.getChildName();
-
-		result = namingException.getDBName(result);
-		return result;
-	}
-	public abstract String getName();
-
-	public String getDbName() {
-		String lowerHyphen = this.getName();
-
-		lowerHyphen = namingException.getDBName(lowerHyphen);
-
-		return lowerHyphen;
-	}
-
-	public abstract ModelType getModelType();
-
-	public boolean hasChild(Introspector child) {
-		boolean result = false;
-		//check all inheriting types for this child
-		if ("true".equals(this.getMetadata(ObjectMetadata.ABSTRACT))) {
-			String[] inheritors = this.getMetadata(ObjectMetadata.INHERITORS).split(",");
-			for (String inheritor : inheritors) {
-				try {
-					Introspector temp = this.loader.introspectorFromName(inheritor);
-					result = temp.hasProperty(child.getName());
-					if (result) {
-						break;
-					}
-				} catch (AAIUnknownObjectException e) {
-					LOGGER.warn("Skipping inheritor " + inheritor + " (Unknown Object) " + LogFormatTools.getStackTop(e));
-				}
-			}
-		} else {
-			result = this.hasProperty(child.getName());
-		}
-		return result;
-	}
-
-	public void setURIChain(String uri) {
-		this.uriChain = uri;
-	}
-	public abstract String getObjectId() throws UnsupportedEncodingException;
-
-	public String getURI() throws UnsupportedEncodingException {
-		//String result = this.uriChain;
-		String result = "";
-		String namespace = this.getMetadata(ObjectMetadata.NAMESPACE);
-		String container = this.getMetadata(ObjectMetadata.CONTAINER);
-		if (this.isContainer()) {
-			 result += "/" + this.getName();
-		} else {
-
-			if (container != null) {
-				result += "/" + container;
-			}
-			result += "/" + this.getDbName() + "/" + this.findKey();
-
-			if (namespace != null && !namespace.equals("")) {
-				result = "/" + namespace + result;
-			}
-		}
-
-
-		return result;
-	}
-
-	public String getGenericURI() {
-		String result = "";
-		if (this.isContainer()) {
-			 result += "/" + this.getName();
-		} else {
-			result += "/" + this.getDbName();
-			for (String key : this.getKeys()) {
-				result += "/{" + this.getDbName() + "-" + key + "}";
-			}
-		}
-
-		return result;
-	}
-
-	public String getFullGenericURI() {
-		String result = "";
-		String namespace = this.getMetadata(ObjectMetadata.NAMESPACE);
-		String container = this.getMetadata(ObjectMetadata.CONTAINER);
-		if (this.isContainer()) {
-			 result += "/" + this.getName();
-		} else {
-
-
-			if (container != null) {
-				result += "/" + container;
-			}
-			result += "/" + this.getDbName();
-
-			for (String key : this.getKeys()) {
-				result += "/{" + this.getDbName() + "-" + key + "}";
-			}
-			if (namespace != null && !namespace.equals("")) {
-				result = "/" + namespace + result;
-			}
-
-		}
-
-		return result;
-	}
-
-	public abstract String preProcessKey(String key);
-
-	protected abstract String findKey() throws UnsupportedEncodingException;
-
-	public abstract String marshal(MarshallerProperties properties);
-
-	public abstract Object getUnderlyingObject();
-
-	public String marshal(boolean formatted) {
-		MarshallerProperties properties =
-				new MarshallerProperties.Builder(MediaType.APPLICATION_JSON_TYPE).formatted(formatted).build();
-
-		return marshal(properties);
-	}
-	public String makeSingular(String word) {
-
-		String result = word;
-		result = result.replaceAll("(?:([ho])es|s)$", "");
-
-		if (result.equals("ClassesOfService")) {
-			result = "ClassOfService";
-		} else if (result.equals("CvlanTag")) {
-			result = "CvlanTagEntry";
-		} else if (result.equals("Metadata")) {
-			result = "Metadatum";
-		}
-		return result;
-	}
-
-	protected String makePlural(String word) {
-		String result = word;
-
-		if (result.equals("cvlan-tag-entry")) {
-			return "cvlan-tags";
-		} else if (result.equals("class-of-service")) {
-			return "classes-of-service";
-		} else if (result.equals("metadatum")) {
-			return "metadata";
-		}
-		result = result.replaceAll("([a-z])$", "$1s");
-		result = result.replaceAll("([hox])s$", "$1es");
-		/*
-		if (result.equals("classes-of-services")) {
-			result = "classes-of-service";
-		}*/
-
-		return result;
-	}
-
-	public abstract String getMetadata(ObjectMetadata metadataName);
-	public abstract Map getPropertyMetadata(String propName);
-	public Optional getPropertyMetadata(String propName, PropertyMetadata metadataName) {
-		final String resultValue = this.getPropertyMetadata(propName).getOrDefault(metadataName, "");
-		Optional result = Optional.empty();
-
-		if (!resultValue.isEmpty()) {
-			result = Optional.of(resultValue);
-		}
-		return result;
-
-	}
-
-	public abstract SchemaVersion getVersion();
-	public Loader getLoader() {
-		return this.loader;
-	}
-
-	public boolean isTopLevel() {
-
-		return this.getMetadata(ObjectMetadata.NAMESPACE) != null;
-	}
+            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+                    | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+                ErrorLogHelper.logError("AAI_4017", e.getMessage());
+            }
+        }
+        return result;
+    }
+
+    public List castValueAccordingToSchema(String name, List objs) {
+        List result = new ArrayList<>();
+
+        for (Object item : objs) {
+            result.add(this.castValueAccordingToSchema(name, item));
+        }
+
+        return result;
+
+    }
+
+    /**
+     *
+     * @param name the property name you'd like to set the value of
+     * @param obj the value to be set
+     * @return
+     */
+    public void setValue(String name, Object obj) {
+        Object box = this.castValueAccordingToSchema(name, obj);
+
+        name = convertPropertyName(name);
+        this.set(name, box);
+    }
+
+    /**
+     *
+     * @return a list of all the properties available on the object
+     */
+    public abstract Set getProperties();
+
+    public Set getProperties(PropertyPredicate p) {
+        final Set temp = new LinkedHashSet<>();
+        this.getProperties().stream().filter(item -> {
+            return p.test(this, item);
+        }).forEach(item -> {
+            temp.add(item);
+        });
+        final Set result = Collections.unmodifiableSet(temp);
+
+        return result;
+
+    }
+
+    public Set getSimpleProperties(PropertyPredicate p) {
+        return this.getProperties().stream().filter(item -> p.test(this, item)).filter(this::isSimpleType)
+                .collect(Collectors.toSet());
+    }
+
+    /**
+     *
+     * @return a list of the required properties on the object
+     */
+    public abstract Set getRequiredProperties();
+
+    /**
+     *
+     * @return a list of the properties that can be used to query the object in the db
+     */
+    public abstract Set getKeys();
+
+    /**
+     *
+     * @return a list of the all key properties for this object
+     */
+    public Set getAllKeys() {
+        Set result = null;
+        if (this.allKeys == null) {
+            Set keys = this.getKeys();
+            result = new LinkedHashSet<>();
+            result.addAll(keys);
+            String altKeys = this.getMetadata(ObjectMetadata.ALTERNATE_KEYS_1);
+            if (altKeys != null) {
+                String[] altKeysArray = altKeys.split(",");
+                for (String altKey : altKeysArray) {
+                    result.add(altKey);
+                }
+            }
+            result = Collections.unmodifiableSet(result);
+            this.allKeys = result;
+        }
+        result = this.allKeys;
+        return result;
+    }
+
+    public Set getIndexedProperties() {
+        Set result = null;
+
+        if (this.indexedProperties == null) {
+            result = new LinkedHashSet<>();
+            Set keys = this.getKeys();
+            result.addAll(keys);
+            String altKeys = this.getMetadata(ObjectMetadata.INDEXED_PROPS);
+            if (altKeys != null) {
+                String[] altKeysArray = altKeys.split(",");
+                for (String altKey : altKeysArray) {
+                    result.add(altKey);
+                }
+            }
+            this.indexedProperties = Collections.unmodifiableSet(result);
+        }
+        result = this.indexedProperties;
+        return result;
+    }
+
+    public Set getUniqueProperties() {
+        Set result = null;
+        if (this.uniqueProperties == null) {
+            String altKeys = this.getMetadata(ObjectMetadata.UNIQUE_PROPS);
+            result = new LinkedHashSet<>();
+            if (altKeys != null) {
+                String[] altKeysArray = altKeys.split(",");
+                for (String altKey : altKeysArray) {
+                    result.add(altKey);
+                }
+            }
+            this.uniqueProperties = Collections.unmodifiableSet(result);
+
+        }
+        result = this.uniqueProperties;
+        return result;
+    }
+
+    public Set getDependentOn() {
+        String dependentOn = this.getMetadata(ObjectMetadata.DEPENDENT_ON);
+        if (dependentOn == null) {
+            return new LinkedHashSet<>();
+        }
+        return new LinkedHashSet<>(Arrays.asList(dependentOn.split(",")));
+    }
+
+    /**
+     *
+     * @param name
+     * @return the string name of the java class of the named property
+     */
+    public String getType(String name) {
+        Class resultClass = this.getClass(name);
+        String result = "";
+
+        if (resultClass != null) {
+            result = resultClass.getName();
+            if (result.equals("java.util.ArrayList")) {
+                result = "java.util.List";
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * This will returned the generic parameterized type of the underlying
+     * object if it exists
+     * 
+     * @param name
+     * @return the generic type of the java class of the underlying object
+     */
+    public String getGenericType(String name) {
+        Class resultClass = this.getGenericTypeClass(name);
+        String result = "";
+
+        if (resultClass != null) {
+            result = resultClass.getName();
+        }
+
+        return result;
+    }
+
+    /**
+     *
+     * @return the string name of the java class of the underlying object
+     */
+    public abstract String getJavaClassName();
+
+    /**
+     *
+     * @param name the property name
+     * @return the Class object
+     */
+    public abstract Class getClass(String name);
+
+    public abstract Class getGenericTypeClass(String name);
+
+    /**
+     *
+     * @param name the property name
+     * @return a new instance of the underlying type of this property
+     * @throws AAIUnknownObjectException
+     */
+    public Object newInstanceOfProperty(String name) throws AAIUnknownObjectException {
+        String type = this.getType(name);
+        return loader.objectFromName(type);
+    }
+
+    public Object newInstanceOfNestedProperty(String name) throws AAIUnknownObjectException {
+        String type = this.getGenericType(name);
+        return loader.objectFromName(type);
+    }
+
+    public Introspector newIntrospectorInstanceOfProperty(String name) throws AAIUnknownObjectException {
+
+        Introspector result = IntrospectorFactory.newInstance(this.getModelType(), this.newInstanceOfProperty(name));
+
+        return result;
+
+    }
+
+    public Introspector newIntrospectorInstanceOfNestedProperty(String name) throws AAIUnknownObjectException {
+
+        Introspector result =
+                IntrospectorFactory.newInstance(this.getModelType(), this.newInstanceOfNestedProperty(name));
+
+        return result;
+
+    }
+
+    /**
+     * Is this type not a Java String or primitive
+     * 
+     * @param name
+     * @return
+     */
+    public boolean isComplexType(String name) {
+        String result = this.getType(name);
+
+        if (result.contains("aai") || result.equals("java.lang.Object")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isComplexGenericType(String name) {
+        String result = this.getGenericType(name);
+
+        if (result.contains("aai")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isSimpleType(String name) {
+        return !(this.isComplexType(name) || this.isListType(name));
+    }
+
+    public boolean isSimpleGenericType(String name) {
+        return !this.isComplexGenericType(name);
+    }
+
+    public boolean isListType(String name) {
+        String result = this.getType(name);
+
+        if (result.contains("java.util.List")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isContainer() {
+        Set props = this.getProperties();
+        boolean result = false;
+        if (props.size() == 1 && this.isListType(props.iterator().next())) {
+            result = true;
+        }
+
+        return result;
+    }
+
+    public abstract String getChildName();
+
+    public String getChildDBName() {
+        String result = this.getChildName();
+
+        result = namingException.getDBName(result);
+        return result;
+    }
+
+    public abstract String getName();
+
+    public String getDbName() {
+        String lowerHyphen = this.getName();
+
+        lowerHyphen = namingException.getDBName(lowerHyphen);
+
+        return lowerHyphen;
+    }
+
+    public abstract ModelType getModelType();
+
+    public boolean hasChild(Introspector child) {
+        boolean result = false;
+        // check all inheriting types for this child
+        if ("true".equals(this.getMetadata(ObjectMetadata.ABSTRACT))) {
+            String[] inheritors = this.getMetadata(ObjectMetadata.INHERITORS).split(",");
+            for (String inheritor : inheritors) {
+                try {
+                    Introspector temp = this.loader.introspectorFromName(inheritor);
+                    result = temp.hasProperty(child.getName());
+                    if (result) {
+                        break;
+                    }
+                } catch (AAIUnknownObjectException e) {
+                    LOGGER.warn(
+                            "Skipping inheritor " + inheritor + " (Unknown Object) " + LogFormatTools.getStackTop(e));
+                }
+            }
+        } else {
+            result = this.hasProperty(child.getName());
+        }
+        return result;
+    }
+
+    public void setURIChain(String uri) {
+        this.uriChain = uri;
+    }
+
+    public abstract String getObjectId() throws UnsupportedEncodingException;
+
+    public String getURI() throws UnsupportedEncodingException {
+        // String result = this.uriChain;
+        String result = "";
+        String namespace = this.getMetadata(ObjectMetadata.NAMESPACE);
+        String container = this.getMetadata(ObjectMetadata.CONTAINER);
+        if (this.isContainer()) {
+            result += "/" + this.getName();
+        } else {
+
+            if (container != null) {
+                result += "/" + container;
+            }
+            result += "/" + this.getDbName() + "/" + this.findKey();
+
+            if (namespace != null && !namespace.equals("")) {
+                result = "/" + namespace + result;
+            }
+        }
+
+        return result;
+    }
+
+    public String getGenericURI() {
+        String result = "";
+        if (this.isContainer()) {
+            result += "/" + this.getName();
+        } else {
+            result += "/" + this.getDbName();
+            for (String key : this.getKeys()) {
+                result += "/{" + this.getDbName() + "-" + key + "}";
+            }
+        }
+
+        return result;
+    }
+
+    public String getFullGenericURI() {
+        String result = "";
+        String namespace = this.getMetadata(ObjectMetadata.NAMESPACE);
+        String container = this.getMetadata(ObjectMetadata.CONTAINER);
+        if (this.isContainer()) {
+            result += "/" + this.getName();
+        } else {
+
+            if (container != null) {
+                result += "/" + container;
+            }
+            result += "/" + this.getDbName();
+
+            for (String key : this.getKeys()) {
+                result += "/{" + this.getDbName() + "-" + key + "}";
+            }
+            if (namespace != null && !namespace.equals("")) {
+                result = "/" + namespace + result;
+            }
+
+        }
+
+        return result;
+    }
+
+    public abstract String preProcessKey(String key);
+
+    protected abstract String findKey() throws UnsupportedEncodingException;
+
+    public abstract String marshal(MarshallerProperties properties);
+
+    public abstract Object getUnderlyingObject();
+
+    public String marshal(boolean formatted) {
+        MarshallerProperties properties =
+                new MarshallerProperties.Builder(MediaType.APPLICATION_JSON_TYPE).formatted(formatted).build();
+
+        return marshal(properties);
+    }
+
+    public String makeSingular(String word) {
+
+        String result = word;
+        result = result.replaceAll("(?:([ho])es|s)$", "");
+
+        if (result.equals("ClassesOfService")) {
+            result = "ClassOfService";
+        } else if (result.equals("CvlanTag")) {
+            result = "CvlanTagEntry";
+        } else if (result.equals("Metadata")) {
+            result = "Metadatum";
+        }
+        return result;
+    }
+
+    protected String makePlural(String word) {
+        String result = word;
+
+        if (result.equals("cvlan-tag-entry")) {
+            return "cvlan-tags";
+        } else if (result.equals("class-of-service")) {
+            return "classes-of-service";
+        } else if (result.equals("metadatum")) {
+            return "metadata";
+        }
+        result = result.replaceAll("([a-z])$", "$1s");
+        result = result.replaceAll("([hox])s$", "$1es");
+        /*
+         * if (result.equals("classes-of-services")) {
+         * result = "classes-of-service";
+         * }
+         */
+
+        return result;
+    }
+
+    public abstract String getMetadata(ObjectMetadata metadataName);
+
+    public abstract Map getPropertyMetadata(String propName);
+
+    public Optional getPropertyMetadata(String propName, PropertyMetadata metadataName) {
+        final String resultValue = this.getPropertyMetadata(propName).getOrDefault(metadataName, "");
+        Optional result = Optional.empty();
+
+        if (!resultValue.isEmpty()) {
+            result = Optional.of(resultValue);
+        }
+        return result;
+
+    }
+
+    public abstract SchemaVersion getVersion();
+
+    public Loader getLoader() {
+        return this.loader;
+    }
+
+    public boolean isTopLevel() {
+
+        return this.getMetadata(ObjectMetadata.NAMESPACE) != null;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorFactory.java b/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorFactory.java
index 93cd2ee1..9b161e36 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorFactory.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorFactory.java
@@ -17,42 +17,43 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 public class IntrospectorFactory {
 
-	/**
-	 * New instance.
-	 *
-	 * @param type the type
-	 * @param o the o
-	 * @return the introspector
-	 */
-	public static Introspector newInstance(ModelType type, Object o) {
-		
-		if (type.equals(ModelType.MOXY)) {
-			return new MoxyStrategy(o);
-		} else {
-			throw new IllegalArgumentException("Unknown class type: " + type); 
-		}
-		
-	}
-	
-	/**
-	 * New instance.
-	 *
-	 * @param type the type
-	 * @param o the o
-	 * @param namedType the named type
-	 * @return the introspector
-	 */
-	public static Introspector newInstance(ModelType type, Object o, String namedType) {
-		
-		if (type.equals(ModelType.JSON)) {
-			return new JSONStrategy(o, namedType);
-		} else {
-			throw new IllegalArgumentException("Unknown class type: " + type); 
-		}
-		
-	}
+    /**
+     * New instance.
+     *
+     * @param type the type
+     * @param o the o
+     * @return the introspector
+     */
+    public static Introspector newInstance(ModelType type, Object o) {
+
+        if (type.equals(ModelType.MOXY)) {
+            return new MoxyStrategy(o);
+        } else {
+            throw new IllegalArgumentException("Unknown class type: " + type);
+        }
+
+    }
+
+    /**
+     * New instance.
+     *
+     * @param type the type
+     * @param o the o
+     * @param namedType the named type
+     * @return the introspector
+     */
+    public static Introspector newInstance(ModelType type, Object o, String namedType) {
+
+        if (type.equals(ModelType.JSON)) {
+            return new JSONStrategy(o, namedType);
+        } else {
+            throw new IllegalArgumentException("Unknown class type: " + type);
+        }
+
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorWalker.java b/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorWalker.java
index e406b0a6..aa5ae156 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorWalker.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/IntrospectorWalker.java
@@ -17,177 +17,181 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
-import org.onap.aai.logging.LogFormatTools;
 
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
+import org.onap.aai.logging.LogFormatTools;
+
 public class IntrospectorWalker {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(IntrospectorWalker.class);
-
-	private Wanderer w = null;
-	private Set blacklist = null;
-	private boolean preventCycles = false;
-	private final PropertyPredicate propVisibility;
-	
-	/**
-	 * Instantiates a new introspector walker.
-	 *
-	 * @param w the w
-	 * @param llBuilder the ll builder
-	 */
-	public IntrospectorWalker(Wanderer w) {
-		this.w = w;
-		this.blacklist = new HashSet<>();
-		this.propVisibility = null;
-	}
-	
-	public IntrospectorWalker(Wanderer w, PropertyPredicate p) {
-		this.w = w;
-		this.blacklist = new HashSet<>();
-		this.propVisibility = p;
-	}
-	
-	
-	/**
-	 * Sets the blacklist.
-	 *
-	 * @param list the new blacklist
-	 */
-	public void setBlacklist(List list) {
-		blacklist.addAll(list);
-	}
-	
-	/**
-	 * Prevent cycles.
-	 *
-	 * @param prevent the prevent
-	 */
-	public void preventCycles(boolean prevent) {
-		this.preventCycles = prevent;
-	}
-	
-	/**
-	 * Walk.
-	 *
-	 * @param obj the obj
-	 * @throws AAIException 
-	 */
-	public void walk(Introspector obj) throws AAIException {
-		Set visited = new HashSet<>();
-
-		walk(obj, null, visited);
-	}
-	
-	/**
-	 * Walk.
-	 *
-	 * @param obj the obj
-	 * @param parent the parent
-	 * @throws AAIException 
-	 */
-	private void walk(Introspector obj, Introspector parent, Set visited) throws AAIException {
-		boolean stopRecursion = false;
-		Set localVisited = new HashSet<>();
-		localVisited.addAll(visited);
-		if (preventCycles) {
-			if (visited.contains(obj.getName())) {
-				stopRecursion = true;
-			}
-			if (!obj.isContainer()) {
-				localVisited.add(obj.getName()); //so we don't recurse while walking its children
-			}
-		}
-		Set props;
-		//props must duplicate the result from getProperties because
-		//it is unmodifiable
-		if (this.propVisibility == null) {
-			props = new LinkedHashSet<>(obj.getProperties());
-		} else {
-			props = new LinkedHashSet<>(obj.getProperties(this.propVisibility));
-		}
-
-		w.processComplexObj(obj);
-		props.removeAll(blacklist);
-		if (!obj.isContainer()) {
-			parent = obj;
-		}
-		for (String prop : props) {
-			
-			if (obj.isSimpleType(prop)) {
-				
-				w.processPrimitive(prop, obj);
-			} else if (obj.isListType(prop) && !stopRecursion) {
-				
-				List listReference = obj.getValue(prop);
-				boolean isComplexType = obj.isComplexGenericType(prop);
-				if (isComplexType) {
-					List list = obj.getWrappedListValue(prop);
-					try {
-						Introspector child = obj.newIntrospectorInstanceOfNestedProperty(prop);
-						w.modifyComplexList(list, listReference, parent, child);
-						for (Object item : listReference) {
-							child = IntrospectorFactory.newInstance(obj.getModelType(), item);
-							walk(child, parent, localVisited);
-						}
-					} catch (AAIUnknownObjectException e) {
-						LOGGER.warn("Skipping property " + prop + " (Unknown Object) " + LogFormatTools.getStackTop(e));
-					}
-				} else {
-					w.processPrimitiveList(prop, obj);
-				}
-				if (listReference.size() == 0) {
-					if (isComplexType) {
-						try {
-							Introspector child = obj.newIntrospectorInstanceOfNestedProperty(prop);
-							int size = w.createComplexListSize(parent, child);
-							for (int i = 0; i < size; i++) {
-								child = obj.newIntrospectorInstanceOfNestedProperty(prop);
-								walk(child, parent, localVisited);
-								listReference.add(child.getUnderlyingObject());
-							}
-
-							obj.setValue(prop, listReference);
-						} catch (AAIUnknownObjectException e) {
-							LOGGER.warn("Skipping property " + prop + " (Unknown Object) " + LogFormatTools.getStackTop(e));
-						}
-					} else if (!isComplexType){
-						w.processPrimitiveList(prop, obj);
-					}
-				}
-			
-			} else if (obj.isComplexType(prop) && !stopRecursion) {
-				Introspector child = null;
-				if (obj.getValue(prop) != null) {
-					child = IntrospectorFactory.newInstance(obj.getModelType(), obj.getValue(prop));
-				} else {
-					if (w.createComplexObjIfNull()) {
-						try {
-							child = obj.newIntrospectorInstanceOfProperty(prop);
-							obj.setValue(prop, child.getUnderlyingObject());
-						} catch (AAIUnknownObjectException e) {
-							LOGGER.warn("Skipping property " + prop + " (Unknown Object) " + LogFormatTools.getStackTop(e));
-						}
-					}
-				}
-				if (child != null) {
-					walk(child, obj, localVisited);
-				}
-			}
-			
-		}
-		/*
-		if (preventCycles && !obj.isContainer()) {
-			visited.remove(obj.getName()); //so we can see it down another path that isn't in danger of recursing over it
-		}*/
-	}
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(IntrospectorWalker.class);
+
+    private Wanderer w = null;
+    private Set blacklist = null;
+    private boolean preventCycles = false;
+    private final PropertyPredicate propVisibility;
+
+    /**
+     * Instantiates a new introspector walker.
+     *
+     * @param w the w
+     * @param llBuilder the ll builder
+     */
+    public IntrospectorWalker(Wanderer w) {
+        this.w = w;
+        this.blacklist = new HashSet<>();
+        this.propVisibility = null;
+    }
+
+    public IntrospectorWalker(Wanderer w, PropertyPredicate p) {
+        this.w = w;
+        this.blacklist = new HashSet<>();
+        this.propVisibility = p;
+    }
+
+    /**
+     * Sets the blacklist.
+     *
+     * @param list the new blacklist
+     */
+    public void setBlacklist(List list) {
+        blacklist.addAll(list);
+    }
+
+    /**
+     * Prevent cycles.
+     *
+     * @param prevent the prevent
+     */
+    public void preventCycles(boolean prevent) {
+        this.preventCycles = prevent;
+    }
+
+    /**
+     * Walk.
+     *
+     * @param obj the obj
+     * @throws AAIException
+     */
+    public void walk(Introspector obj) throws AAIException {
+        Set visited = new HashSet<>();
+
+        walk(obj, null, visited);
+    }
+
+    /**
+     * Walk.
+     *
+     * @param obj the obj
+     * @param parent the parent
+     * @throws AAIException
+     */
+    private void walk(Introspector obj, Introspector parent, Set visited) throws AAIException {
+        boolean stopRecursion = false;
+        Set localVisited = new HashSet<>();
+        localVisited.addAll(visited);
+        if (preventCycles) {
+            if (visited.contains(obj.getName())) {
+                stopRecursion = true;
+            }
+            if (!obj.isContainer()) {
+                localVisited.add(obj.getName()); // so we don't recurse while walking its children
+            }
+        }
+        Set props;
+        // props must duplicate the result from getProperties because
+        // it is unmodifiable
+        if (this.propVisibility == null) {
+            props = new LinkedHashSet<>(obj.getProperties());
+        } else {
+            props = new LinkedHashSet<>(obj.getProperties(this.propVisibility));
+        }
+
+        w.processComplexObj(obj);
+        props.removeAll(blacklist);
+        if (!obj.isContainer()) {
+            parent = obj;
+        }
+        for (String prop : props) {
+
+            if (obj.isSimpleType(prop)) {
+
+                w.processPrimitive(prop, obj);
+            } else if (obj.isListType(prop) && !stopRecursion) {
+
+                List listReference = obj.getValue(prop);
+                boolean isComplexType = obj.isComplexGenericType(prop);
+                if (isComplexType) {
+                    List list = obj.getWrappedListValue(prop);
+                    try {
+                        Introspector child = obj.newIntrospectorInstanceOfNestedProperty(prop);
+                        w.modifyComplexList(list, listReference, parent, child);
+                        for (Object item : listReference) {
+                            child = IntrospectorFactory.newInstance(obj.getModelType(), item);
+                            walk(child, parent, localVisited);
+                        }
+                    } catch (AAIUnknownObjectException e) {
+                        LOGGER.warn("Skipping property " + prop + " (Unknown Object) " + LogFormatTools.getStackTop(e));
+                    }
+                } else {
+                    w.processPrimitiveList(prop, obj);
+                }
+                if (listReference.size() == 0) {
+                    if (isComplexType) {
+                        try {
+                            Introspector child = obj.newIntrospectorInstanceOfNestedProperty(prop);
+                            int size = w.createComplexListSize(parent, child);
+                            for (int i = 0; i < size; i++) {
+                                child = obj.newIntrospectorInstanceOfNestedProperty(prop);
+                                walk(child, parent, localVisited);
+                                listReference.add(child.getUnderlyingObject());
+                            }
+
+                            obj.setValue(prop, listReference);
+                        } catch (AAIUnknownObjectException e) {
+                            LOGGER.warn(
+                                    "Skipping property " + prop + " (Unknown Object) " + LogFormatTools.getStackTop(e));
+                        }
+                    } else if (!isComplexType) {
+                        w.processPrimitiveList(prop, obj);
+                    }
+                }
+
+            } else if (obj.isComplexType(prop) && !stopRecursion) {
+                Introspector child = null;
+                if (obj.getValue(prop) != null) {
+                    child = IntrospectorFactory.newInstance(obj.getModelType(), obj.getValue(prop));
+                } else {
+                    if (w.createComplexObjIfNull()) {
+                        try {
+                            child = obj.newIntrospectorInstanceOfProperty(prop);
+                            obj.setValue(prop, child.getUnderlyingObject());
+                        } catch (AAIUnknownObjectException e) {
+                            LOGGER.warn(
+                                    "Skipping property " + prop + " (Unknown Object) " + LogFormatTools.getStackTop(e));
+                        }
+                    }
+                }
+                if (child != null) {
+                    walk(child, obj, localVisited);
+                }
+            }
+
+        }
+        /*
+         * if (preventCycles && !obj.isContainer()) {
+         * visited.remove(obj.getName()); //so we can see it down another path that isn't in danger of recursing over it
+         * }
+         */
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/JSONStrategy.java b/aai-core/src/main/java/org/onap/aai/introspection/JSONStrategy.java
index d54a9833..55580dc3 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/JSONStrategy.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/JSONStrategy.java
@@ -17,12 +17,8 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.introspection;
 
-import org.json.simple.JSONObject;
-import org.onap.aai.schema.enums.ObjectMetadata;
-import org.onap.aai.schema.enums.PropertyMetadata;
-import org.onap.aai.setup.SchemaVersion;
+package org.onap.aai.introspection;
 
 import java.io.UnsupportedEncodingException;
 import java.util.List;
@@ -30,330 +26,341 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import org.json.simple.JSONObject;
+import org.onap.aai.schema.enums.ObjectMetadata;
+import org.onap.aai.schema.enums.PropertyMetadata;
+import org.onap.aai.setup.SchemaVersion;
+
 public class JSONStrategy extends Introspector {
 
-	private JSONObject json = null;
-	private String namedType = "";
-	protected JSONStrategy(Object o) {
-		super(o);
-		json = (JSONObject)o;
-		//Assumes you provide a wrapper
-		Set keySet = json.keySet();
-		if (keySet.size() == 1) {
-			namedType = keySet.iterator().next();
-			json = (JSONObject)json.get(namedType);
-		} else {
-			throw new IllegalArgumentException("This object has no named type.");
-		}
-	}
-
-	protected JSONStrategy(Object o, String namedType) {
-		super(o);
-		json = (JSONObject)o;
-		this.namedType = namedType;
-
-	}
-
-	@Override
-	public boolean hasProperty(String name) {
-		//TODO
-		return true;
-	}
-	@Override
-	public Object getValue(String name) {
-		Object result = "";
-		result = json.get(name);
-
-		return result;
-	}
-
-	@Override
-	public void setValue(String name, Object obj) {
-		json.put(name, obj);
-
-	}
-	@Override
-	public Object getUnderlyingObject() {
-		return this.json;
-	}
-
-	@Override
-	public Set getProperties() {
-		Set result = json.keySet();
-		return result;
-	}
-
-	@Override
-	public Set getRequiredProperties() {
-		//unknowable
-
-		return this.getProperties();
-	}
-
-	@Override
-	public Set getKeys() {
-		//unknowable
-		return this.getProperties();
-	}
-
-	@Override
-	public Set getAllKeys() {
-		//unknowable
-		return this.getProperties();
-	}
-
-	@Override
-	public String getType(String name) {
-		String result = "";
-		Class resultClass = this.getClass(name);
-		if (resultClass != null) {
-			result = resultClass.getName();
-		}
-
-		if (result.equals("org.json.simple.JSONArray")) {
-			result = "java.util.List";
-		}
-
-		return result;
-	}
-
-	@Override
-	public String getGenericType(String name) {
-		String result = "";
-		Class resultClass = this.getGenericTypeClass(name);
-		if (resultClass != null) {
-			result = resultClass.getName();
-		}
-		return result;
-	}
-
-	@Override
-	public String getJavaClassName() {
-		return json.getClass().getName();
-	}
-
-	@Override
-	public Class getClass(String name) {
-		Class result = null;
-		result = json.get(name).getClass();
-
-		return result;
-	}
-
-	@Override
-	public Class getGenericTypeClass(String name) {
-		Object resultObject = null;
-		Class resultClass = null;
-		resultObject = this.getValue(name);
-		if (resultObject.getClass().getName().equals("org.json.simple.JSONArray")) {
-			resultClass = ((List)resultObject).get(0).getClass();
-		}
-
-		return resultClass;
-	}
-
-	@Override
-	public Object newInstanceOfProperty(String name) {
-		try {
-			return this.getClass(name).newInstance();
-		} catch (InstantiationException | IllegalAccessException e) {
-			return null;
-		}
-	}
-
-	@Override
-	public Object newInstanceOfNestedProperty(String name) {
-		try {
-			return this.getGenericTypeClass(name).newInstance();
-		} catch (InstantiationException | IllegalAccessException e) {
-			return null;
-		}
-	}
-
-	@Override
-	public boolean isComplexType(String name) {
-		String result = this.getType(name);
-
-		if (result.contains("JSONObject")) {
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	@Override
-	public boolean isComplexGenericType(String name) {
-		String result = this.getGenericType(name);
-
-		if (result.contains("JSONObject")) {
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	@Override
-	public boolean isListType(String name) {
-		String result = this.getType(name);
-
-		if (result.contains("java.util.List")) {
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	@Override
-	public boolean isContainer() {
-		Set props = this.getProperties();
-		boolean result = false;
-		if (props.size() == 1 && this.isListType(props.iterator().next())) {
-			result = true;
-		}
-
-		return result;
-	}
-	@Override
-	protected String findKey() {
-		return "";
-	}
-
-	@Override
-	public String getName() {
-		return this.namedType;
-	}
-
-	@Override
-	public String getDbName() {
-		return this.getName();
-	}
-
-	@Override
-	public String getURI() {
-
-		// use a UUID for now
-		return UUID.randomUUID().toString();
-	}
-
-	@Override
-	public String getGenericURI() {
-
-		//there is none defined for this
-		return "";
-	}
-
-	@Override
-	public String preProcessKey (String key) {
-
-		// don't do anything with it
-		return key;
-
-	}
-
-	@Override
-	public String marshal(MarshallerProperties properties) {
-		//TODO
-		return null;
-	}
-
-	@Override
-	public Object clone() {
-		//TODO
-		return null;
-	}
-
-	/*@Override
-	public String findEdgeName(String parent, String child) {
-
-		// Always has for now
-		return "has";
-
-	}*/
-
-	@Override
-	public ModelType getModelType() {
-		return ModelType.JSON;
-	}
-
-	@Override
-	public Set getIndexedProperties() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public String getChildName() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public boolean hasChild(Introspector child) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean isSimpleType(String name) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean isSimpleGenericType(String name) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public Map getPropertyMetadata(String prop) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public String getMetadata(ObjectMetadata metadataName) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public String getChildDBName() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public String getFullGenericURI() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	protected Object get(String name) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	protected void set(String name, Object value) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public String getObjectId() throws UnsupportedEncodingException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SchemaVersion getVersion() {
-		// TODO Auto-generated method stub
-		return null;
-	}
+    private JSONObject json = null;
+    private String namedType = "";
+
+    protected JSONStrategy(Object o) {
+        super(o);
+        json = (JSONObject) o;
+        // Assumes you provide a wrapper
+        Set keySet = json.keySet();
+        if (keySet.size() == 1) {
+            namedType = keySet.iterator().next();
+            json = (JSONObject) json.get(namedType);
+        } else {
+            throw new IllegalArgumentException("This object has no named type.");
+        }
+    }
+
+    protected JSONStrategy(Object o, String namedType) {
+        super(o);
+        json = (JSONObject) o;
+        this.namedType = namedType;
+
+    }
+
+    @Override
+    public boolean hasProperty(String name) {
+        // TODO
+        return true;
+    }
+
+    @Override
+    public Object getValue(String name) {
+        Object result = "";
+        result = json.get(name);
+
+        return result;
+    }
+
+    @Override
+    public void setValue(String name, Object obj) {
+        json.put(name, obj);
+
+    }
+
+    @Override
+    public Object getUnderlyingObject() {
+        return this.json;
+    }
+
+    @Override
+    public Set getProperties() {
+        Set result = json.keySet();
+        return result;
+    }
+
+    @Override
+    public Set getRequiredProperties() {
+        // unknowable
+
+        return this.getProperties();
+    }
+
+    @Override
+    public Set getKeys() {
+        // unknowable
+        return this.getProperties();
+    }
+
+    @Override
+    public Set getAllKeys() {
+        // unknowable
+        return this.getProperties();
+    }
+
+    @Override
+    public String getType(String name) {
+        String result = "";
+        Class resultClass = this.getClass(name);
+        if (resultClass != null) {
+            result = resultClass.getName();
+        }
+
+        if (result.equals("org.json.simple.JSONArray")) {
+            result = "java.util.List";
+        }
+
+        return result;
+    }
+
+    @Override
+    public String getGenericType(String name) {
+        String result = "";
+        Class resultClass = this.getGenericTypeClass(name);
+        if (resultClass != null) {
+            result = resultClass.getName();
+        }
+        return result;
+    }
+
+    @Override
+    public String getJavaClassName() {
+        return json.getClass().getName();
+    }
+
+    @Override
+    public Class getClass(String name) {
+        Class result = null;
+        result = json.get(name).getClass();
+
+        return result;
+    }
+
+    @Override
+    public Class getGenericTypeClass(String name) {
+        Object resultObject = null;
+        Class resultClass = null;
+        resultObject = this.getValue(name);
+        if (resultObject.getClass().getName().equals("org.json.simple.JSONArray")) {
+            resultClass = ((List) resultObject).get(0).getClass();
+        }
+
+        return resultClass;
+    }
+
+    @Override
+    public Object newInstanceOfProperty(String name) {
+        try {
+            return this.getClass(name).newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            return null;
+        }
+    }
+
+    @Override
+    public Object newInstanceOfNestedProperty(String name) {
+        try {
+            return this.getGenericTypeClass(name).newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean isComplexType(String name) {
+        String result = this.getType(name);
+
+        if (result.contains("JSONObject")) {
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+
+    @Override
+    public boolean isComplexGenericType(String name) {
+        String result = this.getGenericType(name);
+
+        if (result.contains("JSONObject")) {
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+
+    @Override
+    public boolean isListType(String name) {
+        String result = this.getType(name);
+
+        if (result.contains("java.util.List")) {
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+
+    @Override
+    public boolean isContainer() {
+        Set props = this.getProperties();
+        boolean result = false;
+        if (props.size() == 1 && this.isListType(props.iterator().next())) {
+            result = true;
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String findKey() {
+        return "";
+    }
+
+    @Override
+    public String getName() {
+        return this.namedType;
+    }
+
+    @Override
+    public String getDbName() {
+        return this.getName();
+    }
+
+    @Override
+    public String getURI() {
+
+        // use a UUID for now
+        return UUID.randomUUID().toString();
+    }
+
+    @Override
+    public String getGenericURI() {
+
+        // there is none defined for this
+        return "";
+    }
+
+    @Override
+    public String preProcessKey(String key) {
+
+        // don't do anything with it
+        return key;
+
+    }
+
+    @Override
+    public String marshal(MarshallerProperties properties) {
+        // TODO
+        return null;
+    }
+
+    @Override
+    public Object clone() {
+        // TODO
+        return null;
+    }
+
+    /*
+     * @Override
+     * public String findEdgeName(String parent, String child) {
+     * 
+     * // Always has for now
+     * return "has";
+     * 
+     * }
+     */
+
+    @Override
+    public ModelType getModelType() {
+        return ModelType.JSON;
+    }
+
+    @Override
+    public Set getIndexedProperties() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getChildName() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean hasChild(Introspector child) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean isSimpleType(String name) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean isSimpleGenericType(String name) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public Map getPropertyMetadata(String prop) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getMetadata(ObjectMetadata metadataName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getChildDBName() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getFullGenericURI() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected Object get(String name) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected void set(String name, Object value) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public String getObjectId() throws UnsupportedEncodingException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public SchemaVersion getVersion() {
+        // TODO Auto-generated method stub
+        return null;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/Loader.java b/aai-core/src/main/java/org/onap/aai/introspection/Loader.java
index cae4cbb7..1da041dc 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/Loader.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/Loader.java
@@ -17,98 +17,99 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
+import java.util.Map;
+import java.util.Set;
+
 import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
 import org.onap.aai.introspection.exceptions.AAIUnmarshallingException;
 import org.onap.aai.restcore.MediaType;
 import org.onap.aai.setup.SchemaVersion;
 
-import java.util.Map;
-import java.util.Set;
-
 public abstract class Loader {
 
-	private final SchemaVersion version;
-	private final ModelType modelType;
-
-	/**
-	 * Instantiates a new loader.
-	 *
-	 * @param version the version
-	 * @param modelType the model type
-	 */
-	public Loader (SchemaVersion version, ModelType modelType) {
-		this.version = version;
-		this.modelType = modelType;
-	}
+    private final SchemaVersion version;
+    private final ModelType modelType;
 
-	/**
-	 * Process.
-	 *
-	 * @param version the version
-	 */
-	protected abstract void process(SchemaVersion version);
+    /**
+     * Instantiates a new loader.
+     *
+     * @param version the version
+     * @param modelType the model type
+     */
+    public Loader(SchemaVersion version, ModelType modelType) {
+        this.version = version;
+        this.modelType = modelType;
+    }
 
-	/**
-	 * Object from name.
-	 *
-	 * @param name the name
-	 * @return the object
-	 * @throws AAIUnknownObjectException
-	 */
-	public abstract Object objectFromName(String name) throws AAIUnknownObjectException;
+    /**
+     * Process.
+     *
+     * @param version the version
+     */
+    protected abstract void process(SchemaVersion version);
 
-	/**
-	 * Introspector from name.
-	 *
-	 * @param name the name
-	 * @return the introspector
-	 * @throws AAIUnknownObjectException
-	 */
-	public abstract Introspector introspectorFromName(String name) throws AAIUnknownObjectException;
+    /**
+     * Object from name.
+     *
+     * @param name the name
+     * @return the object
+     * @throws AAIUnknownObjectException
+     */
+    public abstract Object objectFromName(String name) throws AAIUnknownObjectException;
 
-	/**
-	 * Unmarshal.
-	 *
-	 * @param type the type
-	 * @param json the json
-	 * @param mediaType the media type
-	 * @return the introspector
-	 */
-	public abstract Introspector unmarshal(String type, String json, MediaType mediaType) throws AAIUnmarshallingException;
+    /**
+     * Introspector from name.
+     *
+     * @param name the name
+     * @return the introspector
+     * @throws AAIUnknownObjectException
+     */
+    public abstract Introspector introspectorFromName(String name) throws AAIUnknownObjectException;
 
-	/**
-	 * Unmarshal.
-	 *
-	 * @param type the type
-	 * @param json the json
-	 * @return the introspector
-	 */
-	public Introspector unmarshal(String type, String json) throws AAIUnmarshallingException {
-		return unmarshal(type, json, MediaType.APPLICATION_JSON_TYPE);
-	}
+    /**
+     * Unmarshal.
+     *
+     * @param type the type
+     * @param json the json
+     * @param mediaType the media type
+     * @return the introspector
+     */
+    public abstract Introspector unmarshal(String type, String json, MediaType mediaType)
+            throws AAIUnmarshallingException;
 
+    /**
+     * Unmarshal.
+     *
+     * @param type the type
+     * @param json the json
+     * @return the introspector
+     */
+    public Introspector unmarshal(String type, String json) throws AAIUnmarshallingException {
+        return unmarshal(type, json, MediaType.APPLICATION_JSON_TYPE);
+    }
 
-	/**
-	 * Gets the model type.
-	 *
-	 * @return the model type
-	 */
-	public ModelType getModelType() {
-		return this.modelType;
-	}
+    /**
+     * Gets the model type.
+     *
+     * @return the model type
+     */
+    public ModelType getModelType() {
+        return this.modelType;
+    }
 
-	/**
-	 * Gets the version.
-	 *
-	 * @return the version
-	 */
-	public SchemaVersion getVersion() {
-		return this.version;
-	}
+    /**
+     * Gets the version.
+     *
+     * @return the version
+     */
+    public SchemaVersion getVersion() {
+        return this.version;
+    }
 
-	public abstract Map getAllObjects();
+    public abstract Map getAllObjects();
 
     public abstract Set getNamedPropNodes();
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/LoaderFactory.java b/aai-core/src/main/java/org/onap/aai/introspection/LoaderFactory.java
index 96fd7dbd..dd1bc0f0 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/LoaderFactory.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/LoaderFactory.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import java.util.Map;
@@ -26,49 +27,49 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 public class LoaderFactory {
 
-	@Autowired
-	public Map moxyLoaderInstance;
+    @Autowired
+    public Map moxyLoaderInstance;
 
-	public LoaderFactory(Map moxyLoaderInstance) {
-		this.moxyLoaderInstance = moxyLoaderInstance;
-	}
+    public LoaderFactory(Map moxyLoaderInstance) {
+        this.moxyLoaderInstance = moxyLoaderInstance;
+    }
 
-	/**
-	 * Creates a new Loader object.
-	 *
-	 * @param type
-	 *            the type
-	 * @param version
-	 *            the version
-	 * @param llBuilder
-	 *            the ll builder
-	 * @return the loader
-	 */
-	public Loader createLoaderForVersion(ModelType type, SchemaVersion version) {
+    /**
+     * Creates a new Loader object.
+     *
+     * @param type
+     *        the type
+     * @param version
+     *        the version
+     * @param llBuilder
+     *        the ll builder
+     * @return the loader
+     */
+    public Loader createLoaderForVersion(ModelType type, SchemaVersion version) {
 
-		if (type.equals(ModelType.MOXY)) {
-			return getMoxyLoaderInstance().get(version);
-		}
+        if (type.equals(ModelType.MOXY)) {
+            return getMoxyLoaderInstance().get(version);
+        }
 
-		return null;
+        return null;
 
-	}
+    }
 
-	public Loader getLoaderStrategy(ModelType type, SchemaVersion version) {
+    public Loader getLoaderStrategy(ModelType type, SchemaVersion version) {
 
-		if (type.equals(ModelType.MOXY)) {
-			return getMoxyLoaderInstance().get(version);
-		}
-		return null;
+        if (type.equals(ModelType.MOXY)) {
+            return getMoxyLoaderInstance().get(version);
+        }
+        return null;
 
-	}
+    }
 
-	public Map getMoxyLoaderInstance() {
-		return moxyLoaderInstance;
-	}
+    public Map getMoxyLoaderInstance() {
+        return moxyLoaderInstance;
+    }
 
-	public void setMoxyLoaderInstance(Map moxyLoaderInstance) {
-		this.moxyLoaderInstance = moxyLoaderInstance;
-	}
+    public void setMoxyLoaderInstance(Map moxyLoaderInstance) {
+        this.moxyLoaderInstance = moxyLoaderInstance;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/LoaderUtil.java b/aai-core/src/main/java/org/onap/aai/introspection/LoaderUtil.java
index 16d87d96..173cc8b3 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/LoaderUtil.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/LoaderUtil.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import org.onap.aai.config.SpringContextAware;
@@ -24,9 +25,9 @@ import org.onap.aai.setup.SchemaVersions;
 
 public class LoaderUtil {
 
-    public static Loader getLatestVersion(){
+    public static Loader getLatestVersion() {
 
-        LoaderFactory loaderFactory   = SpringContextAware.getBean(LoaderFactory.class);
+        LoaderFactory loaderFactory = SpringContextAware.getBean(LoaderFactory.class);
         SchemaVersions schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions");
 
         return loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/MarshallerProperties.java b/aai-core/src/main/java/org/onap/aai/introspection/MarshallerProperties.java
index 2824dbbe..776b07e6 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/MarshallerProperties.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/MarshallerProperties.java
@@ -17,122 +17,123 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import org.onap.aai.restcore.MediaType;
 
 public class MarshallerProperties {
 
-	private final MediaType type;
-	private final boolean includeRoot;
-	private final boolean wrapperAsArrayName;
-	private final boolean formatted;
-	
-	/**
-	 * Instantiates a new marshaller properties.
-	 *
-	 * @param builder the builder
-	 */
-	private MarshallerProperties(Builder builder) {
-		
-		this.type = builder.type;
-		this.includeRoot = builder.includeRoot;
-		this.wrapperAsArrayName = builder.wrapperAsArrayName;
-		this.formatted = builder.formatted;
-	}
-	
-	/**
-	 * Gets the media type.
-	 *
-	 * @return the media type
-	 */
-	public MediaType getMediaType() {
-		return this.type;
-	}
-	
-	/**
-	 * Gets the include root.
-	 *
-	 * @return the include root
-	 */
-	public boolean getIncludeRoot() {
-		return this.includeRoot;
-	}
-	
-	/**
-	 * Gets the wrapper as array name.
-	 *
-	 * @return the wrapper as array name
-	 */
-	public boolean getWrapperAsArrayName() {
-		return this.wrapperAsArrayName;
-	}
-	
-	/**
-	 * Gets the formatted.
-	 *
-	 * @return the formatted
-	 */
-	public boolean getFormatted() {
-		return this.formatted;
-	}
-	
-	public static class Builder {
-		
-		private final MediaType type;
-		private boolean includeRoot = false;
-		private boolean wrapperAsArrayName = true;
-		private boolean formatted = false;
-		
-		/**
-		 * Instantiates a new builder.
-		 *
-		 * @param type the type
-		 */
-		public Builder(MediaType type) {
-			this.type = type;
-		}
-		
-		/**
-		 * Include root.
-		 *
-		 * @param includeRoot the include root
-		 * @return the builder
-		 */
-		public Builder includeRoot (boolean includeRoot) {
-			this.includeRoot = includeRoot;
-			return this;
-		}
-		
-		/**
-		 * Wrapper as array name.
-		 *
-		 * @param wrapperAsArrayName the wrapper as array name
-		 * @return the builder
-		 */
-		public Builder wrapperAsArrayName (boolean wrapperAsArrayName) {
-			this.wrapperAsArrayName = wrapperAsArrayName;
-			return this;
-		}
-		
-		/**
-		 * Formatted.
-		 *
-		 * @param formatted the formatted
-		 * @return the builder
-		 */
-		public Builder formatted (boolean formatted) {
-			this.formatted = formatted;
-			return this;
-		}
-		
-		/**
-		 * Builds the properties.
-		 *
-		 * @return the marshaller properties
-		 */
-		public MarshallerProperties build() {
-			return new MarshallerProperties(this);
-		}
-	}
+    private final MediaType type;
+    private final boolean includeRoot;
+    private final boolean wrapperAsArrayName;
+    private final boolean formatted;
+
+    /**
+     * Instantiates a new marshaller properties.
+     *
+     * @param builder the builder
+     */
+    private MarshallerProperties(Builder builder) {
+
+        this.type = builder.type;
+        this.includeRoot = builder.includeRoot;
+        this.wrapperAsArrayName = builder.wrapperAsArrayName;
+        this.formatted = builder.formatted;
+    }
+
+    /**
+     * Gets the media type.
+     *
+     * @return the media type
+     */
+    public MediaType getMediaType() {
+        return this.type;
+    }
+
+    /**
+     * Gets the include root.
+     *
+     * @return the include root
+     */
+    public boolean getIncludeRoot() {
+        return this.includeRoot;
+    }
+
+    /**
+     * Gets the wrapper as array name.
+     *
+     * @return the wrapper as array name
+     */
+    public boolean getWrapperAsArrayName() {
+        return this.wrapperAsArrayName;
+    }
+
+    /**
+     * Gets the formatted.
+     *
+     * @return the formatted
+     */
+    public boolean getFormatted() {
+        return this.formatted;
+    }
+
+    public static class Builder {
+
+        private final MediaType type;
+        private boolean includeRoot = false;
+        private boolean wrapperAsArrayName = true;
+        private boolean formatted = false;
+
+        /**
+         * Instantiates a new builder.
+         *
+         * @param type the type
+         */
+        public Builder(MediaType type) {
+            this.type = type;
+        }
+
+        /**
+         * Include root.
+         *
+         * @param includeRoot the include root
+         * @return the builder
+         */
+        public Builder includeRoot(boolean includeRoot) {
+            this.includeRoot = includeRoot;
+            return this;
+        }
+
+        /**
+         * Wrapper as array name.
+         *
+         * @param wrapperAsArrayName the wrapper as array name
+         * @return the builder
+         */
+        public Builder wrapperAsArrayName(boolean wrapperAsArrayName) {
+            this.wrapperAsArrayName = wrapperAsArrayName;
+            return this;
+        }
+
+        /**
+         * Formatted.
+         *
+         * @param formatted the formatted
+         * @return the builder
+         */
+        public Builder formatted(boolean formatted) {
+            this.formatted = formatted;
+            return this;
+        }
+
+        /**
+         * Builds the properties.
+         *
+         * @return the marshaller properties
+         */
+        public MarshallerProperties build() {
+            return new MarshallerProperties(this);
+        }
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/ModelType.java b/aai-core/src/main/java/org/onap/aai/introspection/ModelType.java
index 2554c54a..9defd86e 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/ModelType.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/ModelType.java
@@ -17,8 +17,9 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 public enum ModelType {
-	MOXY, POJO, JSON
+    MOXY, POJO, JSON
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/MoxyLoader.java b/aai-core/src/main/java/org/onap/aai/introspection/MoxyLoader.java
index 35583d7c..02254a8b 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/MoxyLoader.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/MoxyLoader.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import com.att.eelf.configuration.EELFLogger;
@@ -24,6 +25,16 @@ import com.att.eelf.configuration.EELFManager;
 import com.google.common.base.CaseFormat;
 import com.google.common.collect.ImmutableMap;
 
+import java.io.*;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
 import org.eclipse.persistence.dynamic.DynamicEntity;
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
@@ -38,184 +49,177 @@ import org.onap.aai.restcore.MediaType;
 import org.onap.aai.schema.enums.ObjectMetadata;
 import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.workarounds.NamingExceptions;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.stream.StreamSource;
-import java.io.*;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
 
 public class MoxyLoader extends Loader {
 
     private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(MoxyLoader.class);
 
-	private DynamicJAXBContext jaxbContext = null;
-	private Map allObjs = null;
+    private DynamicJAXBContext jaxbContext = null;
+    private Map allObjs = null;
 
-	private Map moxyLoaderFactory;
+    private Map moxyLoaderFactory;
 
-	private NodeIngestor nodeIngestor;
-	private CaseFormatStore caseFormatStore;
+    private NodeIngestor nodeIngestor;
+    private CaseFormatStore caseFormatStore;
 
-	private Set namedProps;
+    private Set namedProps;
 
-	public MoxyLoader(SchemaVersion version, NodeIngestor nodeIngestor) {
-		super(version, ModelType.MOXY);
-		this.nodeIngestor = nodeIngestor;
-		this.caseFormatStore = nodeIngestor.getCaseFormatStore();
-		process(version);
-	}
+    public MoxyLoader(SchemaVersion version, NodeIngestor nodeIngestor) {
+        super(version, ModelType.MOXY);
+        this.nodeIngestor = nodeIngestor;
+        this.caseFormatStore = nodeIngestor.getCaseFormatStore();
+        process(version);
+    }
 
-	public MoxyLoader getMoxyLoader(SchemaVersion v) {
-		return moxyLoaderFactory.get(v);
+    public MoxyLoader getMoxyLoader(SchemaVersion v) {
+        return moxyLoaderFactory.get(v);
 
-	}
-	/**
-	 * {@inheritDoc}
-	 * @throws AAIUnknownObjectException
-	 */
-	@Override
-	public Introspector introspectorFromName(String name) throws AAIUnknownObjectException {
+    }
 
-		return IntrospectorFactory.newInstance(ModelType.MOXY, objectFromName(name));
-	}
+    /**
+     * {@inheritDoc}
+     * 
+     * @throws AAIUnknownObjectException
+     */
+    @Override
+    public Introspector introspectorFromName(String name) throws AAIUnknownObjectException {
 
-	private boolean containsUpperCase(String str){
+        return IntrospectorFactory.newInstance(ModelType.MOXY, objectFromName(name));
+    }
+
+    private boolean containsUpperCase(String str) {
 
-	    for(int i = 0; i < str.length(); i++){
-	        if(Character.isUpperCase(str.charAt(i))){
-	            return true;
+        for (int i = 0; i < str.length(); i++) {
+            if (Character.isUpperCase(str.charAt(i))) {
+                return true;
             }
         }
 
         return false;
     }
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public Object objectFromName(String name) throws AAIUnknownObjectException {
-
-		if (name == null) {
-			throw new AAIUnknownObjectException("null name passed in");
-		}
-		final String sanitizedName = NamingExceptions.getInstance().getObjectName(name);
-		final String upperCamel;
-
-		//Contains any uppercase, then assume it's upper camel
-		if (containsUpperCase(name)) {
-			upperCamel = sanitizedName;
-		} else {
-			upperCamel = caseFormatStore
-                .fromLowerHyphenToUpperCamel(sanitizedName)
-                .orElseGet(
-                    () -> {
-                        LOGGER.debug("Unable to find {} in the store for lower hyphen to upper camel", sanitizedName);
-                        return CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, sanitizedName);
-                    }
-                );
-		}
-
-		try {
-			final DynamicEntity result = jaxbContext.newDynamicEntity(upperCamel);
-
-			if (result == null) throw new AAIUnknownObjectException("Unrecognized AAI object " + name);
-
-			return result;
-		} catch (IllegalArgumentException e) {
-			//entity does not exist
-			throw new AAIUnknownObjectException("Unrecognized AAI object " + name, e);
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	protected void process(SchemaVersion version) {
-		/*
-		 * We need to have just same JaxbContext for each version
-		 */
-		jaxbContext = nodeIngestor.getContextForVersion(version);
-
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public Introspector unmarshal(String type, String json, MediaType mediaType) throws AAIUnmarshallingException {
-		try {
-			final Object clazz = objectFromName(type);
-			final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-
-			if (mediaType.equals(MediaType.APPLICATION_JSON_TYPE)) {
-				unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
-				unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
-				unmarshaller.setProperty(UnmarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
-			}
-
-			final DynamicEntity entity = (DynamicEntity) unmarshaller.unmarshal(new StreamSource(new StringReader(json)), clazz.getClass()).getValue();
-			return IntrospectorFactory.newInstance(ModelType.MOXY, entity);
-		} catch (JAXBException e) {
-			AAIException ex = new AAIException("AAI_4007", e);
-			ErrorLogHelper.logException(ex);
-			throw new AAIUnmarshallingException("Could not unmarshall: " + e.getMessage(), ex);
-		} catch (AAIUnknownObjectException e) {
-			throw new AAIUnmarshallingException("Could not unmarshall: " + e.getMessage(), e);
-		}
-	}
-
-	@Override
-	public Map getAllObjects() {
-		if (this.allObjs != null) {
-			return allObjs;
-		} else {
-			ImmutableMap.Builder map = new ImmutableMap.Builder<>();
-			Set objs = objectsInVersion();
-			for (String objName : objs) {
-				try {
-					Introspector introspector = this.introspectorFromName(objName);
-					map.put(introspector.getDbName(), introspector);
-				} catch (AAIUnknownObjectException e) {
-					LOGGER.warn("Unexpected AAIUnknownObjectException while running getAllObjects() " + LogFormatTools.getStackTop(e));
-				}
-			}
-			allObjs = map.build();
-			return allObjs;
-		}
-	}
-
-	private Set objectsInVersion() {
-		 Set result = new HashSet<>();
-
-		try {
-	         result = nodeIngestor.getObjectsInVersion(getVersion());
-
-		} catch (Exception e) {
-			LOGGER.warn("Exception while enumerating objects for API version " + getVersion() + " (returning partial results) " + LogFormatTools.getStackTop(e));
-		}
-
-		return result;
-	}
-
-	@Override
-	public Set getNamedPropNodes(){
-
-        if(namedProps == null){
-	        namedProps = getAllObjects()
-                .entrySet()
-                .stream()
-                .filter(
-                    (entry) -> entry.getValue().getMetadata(ObjectMetadata.NAME_PROPS) != null
-                ).map(entry -> entry.getKey()).collect(Collectors.toSet());
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object objectFromName(String name) throws AAIUnknownObjectException {
+
+        if (name == null) {
+            throw new AAIUnknownObjectException("null name passed in");
+        }
+        final String sanitizedName = NamingExceptions.getInstance().getObjectName(name);
+        final String upperCamel;
+
+        // Contains any uppercase, then assume it's upper camel
+        if (containsUpperCase(name)) {
+            upperCamel = sanitizedName;
+        } else {
+            upperCamel = caseFormatStore.fromLowerHyphenToUpperCamel(sanitizedName).orElseGet(() -> {
+                LOGGER.debug("Unable to find {} in the store for lower hyphen to upper camel", sanitizedName);
+                return CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, sanitizedName);
+            });
+        }
+
+        try {
+            final DynamicEntity result = jaxbContext.newDynamicEntity(upperCamel);
+
+            if (result == null)
+                throw new AAIUnknownObjectException("Unrecognized AAI object " + name);
+
+            return result;
+        } catch (IllegalArgumentException e) {
+            // entity does not exist
+            throw new AAIUnknownObjectException("Unrecognized AAI object " + name, e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void process(SchemaVersion version) {
+        /*
+         * We need to have just same JaxbContext for each version
+         */
+        jaxbContext = nodeIngestor.getContextForVersion(version);
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Introspector unmarshal(String type, String json, MediaType mediaType) throws AAIUnmarshallingException {
+        try {
+            final Object clazz = objectFromName(type);
+            final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+
+            if (mediaType.equals(MediaType.APPLICATION_JSON_TYPE)) {
+                unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
+                unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
+                unmarshaller.setProperty(UnmarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
+            }
+
+            final DynamicEntity entity = (DynamicEntity) unmarshaller
+                    .unmarshal(new StreamSource(new StringReader(json)), clazz.getClass()).getValue();
+            return IntrospectorFactory.newInstance(ModelType.MOXY, entity);
+        } catch (JAXBException e) {
+            AAIException ex = new AAIException("AAI_4007", e);
+            ErrorLogHelper.logException(ex);
+            throw new AAIUnmarshallingException("Could not unmarshall: " + e.getMessage(), ex);
+        } catch (AAIUnknownObjectException e) {
+            throw new AAIUnmarshallingException("Could not unmarshall: " + e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public Map getAllObjects() {
+        if (this.allObjs != null) {
+            return allObjs;
+        } else {
+            ImmutableMap.Builder map = new ImmutableMap.Builder<>();
+            Set objs = objectsInVersion();
+            for (String objName : objs) {
+                try {
+                    Introspector introspector = this.introspectorFromName(objName);
+                    map.put(introspector.getDbName(), introspector);
+                } catch (AAIUnknownObjectException e) {
+                    LOGGER.warn("Unexpected AAIUnknownObjectException while running getAllObjects() "
+                            + LogFormatTools.getStackTop(e));
+                }
+            }
+            allObjs = map.build();
+            return allObjs;
+        }
+    }
+
+    private Set objectsInVersion() {
+        Set result = new HashSet<>();
+
+        try {
+            result = nodeIngestor.getObjectsInVersion(getVersion());
+
+        } catch (Exception e) {
+            LOGGER.warn("Exception while enumerating objects for API version " + getVersion()
+                    + " (returning partial results) " + LogFormatTools.getStackTop(e));
+        }
+
+        return result;
+    }
+
+    @Override
+    public Set getNamedPropNodes() {
+
+        if (namedProps == null) {
+            namedProps = getAllObjects().entrySet().stream()
+                    .filter((entry) -> entry.getValue().getMetadata(ObjectMetadata.NAME_PROPS) != null)
+                    .map(entry -> entry.getKey()).collect(Collectors.toSet());
         }
 
         return namedProps;
     }
-	public DynamicJAXBContext getJAXBContext() {
-		return this.jaxbContext;
-	}
+
+    public DynamicJAXBContext getJAXBContext() {
+        return this.jaxbContext;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/MoxyStrategy.java b/aai-core/src/main/java/org/onap/aai/introspection/MoxyStrategy.java
index 455e7846..15311638 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/MoxyStrategy.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/MoxyStrategy.java
@@ -17,12 +17,22 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.google.common.base.CaseFormat;
 import com.google.common.base.Joiner;
+
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+import java.util.Map.Entry;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.dynamic.DynamicEntity;
 import org.eclipse.persistence.dynamic.DynamicType;
@@ -42,334 +52,316 @@ import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.setup.SchemaVersion;
 import org.springframework.web.util.UriUtils;
 
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.*;
-import java.util.Map.Entry;
-
 public class MoxyStrategy extends Introspector {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(MoxyStrategy.class);
-	private DynamicEntity internalObject = null;
-	private DynamicType internalType = null;
-	private DynamicJAXBContext jaxbContext = null;
-	private ClassDescriptor cd = null;
-	private SchemaVersion version = null;
-	private Set properties = null;
-	private Set keys = null;
-	private Set requiredProperties = null;
-
-	private boolean isInitialized = false;
-
-	protected MoxyStrategy(Object obj) {
-		super(obj);
-		/* must look up the correct jaxbcontext for this object */
-		className = MoxyStrategy.class.getSimpleName();
-		internalObject = (DynamicEntity)obj;
-		version = nodeIngestor.getVersionFromClassName(internalObject.getClass().getName());
-		super.loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(getModelType(), version);
-		jaxbContext = nodeIngestor.getContextForVersion(version);
-		String simpleName = internalObject.getClass().getName();
-		internalType = jaxbContext.getDynamicType(simpleName);
-
-		cd = internalType.getDescriptor();
-	}
-
-	private void init() {
-		isInitialized = true;
-
-		Set props = new LinkedHashSet<>();
-		for (String s : internalType.getPropertiesNames()) {
-		    String value = caseFormatStore
-                .fromLowerCamelToLowerHyphen(s)
-                .orElseGet(
-                    () -> {
-                        LOGGER.debug("Unable to find {} in the store from lower camel to lower hyphen", s);
-                        return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, s);
-                    }
-                );
-			props.add(value);
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(MoxyStrategy.class);
+    private DynamicEntity internalObject = null;
+    private DynamicType internalType = null;
+    private DynamicJAXBContext jaxbContext = null;
+    private ClassDescriptor cd = null;
+    private SchemaVersion version = null;
+    private Set properties = null;
+    private Set keys = null;
+    private Set requiredProperties = null;
+
+    private boolean isInitialized = false;
+
+    protected MoxyStrategy(Object obj) {
+        super(obj);
+        /* must look up the correct jaxbcontext for this object */
+        className = MoxyStrategy.class.getSimpleName();
+        internalObject = (DynamicEntity) obj;
+        version = nodeIngestor.getVersionFromClassName(internalObject.getClass().getName());
+        super.loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(getModelType(), version);
+        jaxbContext = nodeIngestor.getContextForVersion(version);
+        String simpleName = internalObject.getClass().getName();
+        internalType = jaxbContext.getDynamicType(simpleName);
+
+        cd = internalType.getDescriptor();
+    }
+
+    private void init() {
+        isInitialized = true;
+
+        Set props = new LinkedHashSet<>();
+        for (String s : internalType.getPropertiesNames()) {
+            String value = caseFormatStore.fromLowerCamelToLowerHyphen(s).orElseGet(() -> {
+                LOGGER.debug("Unable to find {} in the store from lower camel to lower hyphen", s);
+                return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, s);
+            });
+            props.add(value);
+
+        }
+        props = Collections.unmodifiableSet(props);
+        this.properties = props;
+
+        Set requiredProps = new LinkedHashSet<>();
+        for (DatabaseMapping dm : cd.getMappings()) {
+            if (dm.getField() instanceof XMLField) {
+                XMLField x = (XMLField) dm.getField();
+                if (x != null && x.isRequired()) {
+                    requiredProps.add(this.removeXPathDescriptor(x.getName()));
+                }
+            }
+        }
+        requiredProps = Collections.unmodifiableSet(requiredProps);
+        this.requiredProperties = requiredProps;
 
-		}
-		props = Collections.unmodifiableSet(props);
-		this.properties = props;
+        Set keys = new LinkedHashSet<>();
 
-		Set requiredProps = new LinkedHashSet<>();
-		for (DatabaseMapping dm : cd.getMappings()) {
-			if (dm.getField() instanceof XMLField) {
-				XMLField x = (XMLField)dm.getField();
-				if (x != null && x.isRequired()) {
-					requiredProps.add(this.removeXPathDescriptor(x.getName()));
-				}
-			}
-		}
-		requiredProps = Collections.unmodifiableSet(requiredProps);
-		this.requiredProperties = requiredProps;
-
-		Set keys = new LinkedHashSet<>();
-
-		for (String name : internalType.getDescriptor().getPrimaryKeyFieldNames()) {
-			keys.add(this.removeXPathDescriptor(name));
-		}
-		keys = Collections.unmodifiableSet(keys);
-		this.keys = keys;
-
-
-	}
-
-	@Override
-	public boolean hasProperty(String name) {
-		String convertedName = convertPropertyName(name);
-
-		return internalType.containsProperty(convertedName);
-	}
-
-	@Override
-	public Object get(String name) {
-		return internalObject.get(name);
-	}
-
-	@Override
-	public void set(String name, Object obj){
-
-		internalObject.set(name, obj);
-	}
-
-	@Override
-	public Set getProperties() {
-
-		if(!isInitialized){
-			init();
-		}
-
-		return this.properties;
-
-	}
-
-	@Override
-	public Set getRequiredProperties() {
-
-		if(!isInitialized){
-			init();
-		}
-
-		return this.requiredProperties;
-	}
-
-	@Override
-	public Set getKeys() {
-
-		if(!isInitialized){
-			init();
-		}
-
-		return this.keys;
-	}
-
-	@Override
-	public Map getPropertyMetadata(String prop) {
-		String propName = this.convertPropertyName(prop);
-		DatabaseMapping mapping = cd.getMappingForAttributeName(propName);
-		Map result = new HashMap<>();
-		if (mapping != null) {
-			Set entrySet = mapping.getProperties().entrySet();
-			for (Entry entry : entrySet) {
-				result.put(
-						PropertyMetadata.valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, (String)entry.getKey())), (String)entry.getValue());
-			}
-		}
-
-		return result;
-	}
-
-	@Override
-	public String getJavaClassName() {
-		return internalObject.getClass().getName();
-	}
-
-
-
-	@Override
-	public Class getClass(String name) {
-		name = convertPropertyName(name);
-		Class resultClass = null;
-		try {
-			if (internalType.getPropertyType(name) == null) {
-				if (cd.getMappingForAttributeName(name) instanceof XMLCompositeDirectCollectionMapping) {
-					resultClass = cd.getMappingForAttributeName(name).getContainerPolicy().getContainerClass();
-
-				} else if (cd.getMappingForAttributeName(name) instanceof XMLCompositeCollectionMapping) {
-					resultClass = cd.getMappingForAttributeName(name).getContainerPolicy().getContainerClass();
-				} else {
-					ClassDescriptor referenceDiscriptor = cd.getMappingForAttributeName(name).getReferenceDescriptor();
-					if (referenceDiscriptor != null) {
-						resultClass = referenceDiscriptor.getJavaClass();
-					} else {
-						resultClass = Object.class;
-					}
-				}
-			} else {
-				resultClass = internalType.getPropertyType(name);
-			}
-		} catch (DynamicException e) {
-			//property doesn't exist
-		}
-		return resultClass;
-	}
-
-	@Override
-	public Class getGenericTypeClass(String name) {
-		name = convertPropertyName(name);
-		Class resultClass = null;
-		if (internalType.getPropertyType(name) == null) {
-			if (cd.getMappingForAttributeName(name) instanceof XMLCompositeDirectCollectionMapping) {
-				resultClass = cd.getMappingForAttributeName(name).getFields().get(0).getType();
-
-			} else if (cd.getMappingForAttributeName(name) instanceof XMLCompositeCollectionMapping) {
-				resultClass = cd.getMappingForAttributeName(name).getReferenceDescriptor().getJavaClass();
-			}
-		}
-
-		return resultClass;
-	}
-
-	@Override
-	public Object getUnderlyingObject() {
-		return this.internalObject;
-	}
-
-	@Override
-	public String getChildName() {
-
-		String className = internalObject.getClass().getSimpleName();
-		String lowerHyphen = caseFormatStore
-            .fromUpperCamelToLowerHyphen(className)
-            .orElseGet(
-                () -> {
-                    LOGGER.debug("Unable to find {} in the store for upper camel to lower hyphen", className);
-                    return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, className);
-                }
-            );
+        for (String name : internalType.getDescriptor().getPrimaryKeyFieldNames()) {
+            keys.add(this.removeXPathDescriptor(name));
+        }
+        keys = Collections.unmodifiableSet(keys);
+        this.keys = keys;
 
-		if (this.isContainer()) {
-		    String upperCamel = this.getGenericTypeClass(this.getProperties().iterator().next()).getSimpleName();
+    }
 
-			lowerHyphen = caseFormatStore
-                .fromUpperCamelToLowerHyphen(upperCamel)
-                .orElseGet(
-                    () -> {
-                        LOGGER.debug("Unable to find {} in the store for upper camel to lower hyphen", upperCamel);
-                        return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, upperCamel);
-                    }
-                );
-		}
-
-		return lowerHyphen;
-	}
-
-	@Override
-	public String getName() {
-		String className = internalObject.getClass().getSimpleName();
-		return caseFormatStore
-            .fromUpperCamelToLowerHyphen(className)
-            .orElseGet(() -> {
-                LOGGER.debug("Unable to find {} in the store for upper camel to lower hyphen", className);
-                return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, className);
-            });
-	}
+    @Override
+    public boolean hasProperty(String name) {
+        String convertedName = convertPropertyName(name);
+
+        return internalType.containsProperty(convertedName);
+    }
 
-	@Override
-	public String getObjectId() throws UnsupportedEncodingException {
-		String result = "";
-		String container = this.getMetadata(ObjectMetadata.CONTAINER);
-		if (this.isContainer()) {
-			 result += "/" + this.getName();
-		} else {
+    @Override
+    public Object get(String name) {
+        return internalObject.get(name);
+    }
 
-			if (container != null) {
-				result += "/" + container;
-			}
-			result += "/" + this.getDbName() + "/" + this.findKey();
+    @Override
+    public void set(String name, Object obj) {
 
-		}
+        internalObject.set(name, obj);
+    }
 
-		return result;
-	}
+    @Override
+    public Set getProperties() {
 
-	@Override
-	protected String findKey() throws UnsupportedEncodingException {
-		Set keys = null;
-		keys = this.getKeys();
-		List results = new ArrayList<>();
-		for (String key : keys) {
-			String value = UriUtils.encode(this.getValue(key).toString(), "UTF-8");
-			results.add(value);
-		}
+        if (!isInitialized) {
+            init();
+        }
 
-		return Joiner.on("/").join(results);
-	}
+        return this.properties;
 
-	@Override
-	public String preProcessKey (String key) {
-		String result = "";
-		String[] split = key.split("/");
-		int i = 0;
-		for (i = split.length-1; i >= 0; i--) {
+    }
 
-			if (jaxbContext.getDynamicType(split[i]) != null) {
-				break;
+    @Override
+    public Set getRequiredProperties() {
 
-			}
+        if (!isInitialized) {
+            init();
+        }
 
-		}
-		result = Joiner.on("/").join(Arrays.copyOfRange(split, 0, i));
+        return this.requiredProperties;
+    }
 
-		return result;
+    @Override
+    public Set getKeys() {
 
-	}
+        if (!isInitialized) {
+            init();
+        }
 
-	@Override
-	public String marshal(MarshallerProperties properties) {
-		StringWriter result = new StringWriter();
+        return this.keys;
+    }
+
+    @Override
+    public Map getPropertyMetadata(String prop) {
+        String propName = this.convertPropertyName(prop);
+        DatabaseMapping mapping = cd.getMappingForAttributeName(propName);
+        Map result = new HashMap<>();
+        if (mapping != null) {
+            Set entrySet = mapping.getProperties().entrySet();
+            for (Entry entry : entrySet) {
+                result.put(
+                        PropertyMetadata.valueOf(
+                                CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, (String) entry.getKey())),
+                        (String) entry.getValue());
+            }
+        }
+
+        return result;
+    }
+
+    @Override
+    public String getJavaClassName() {
+        return internalObject.getClass().getName();
+    }
+
+    @Override
+    public Class getClass(String name) {
+        name = convertPropertyName(name);
+        Class resultClass = null;
+        try {
+            if (internalType.getPropertyType(name) == null) {
+                if (cd.getMappingForAttributeName(name) instanceof XMLCompositeDirectCollectionMapping) {
+                    resultClass = cd.getMappingForAttributeName(name).getContainerPolicy().getContainerClass();
+
+                } else if (cd.getMappingForAttributeName(name) instanceof XMLCompositeCollectionMapping) {
+                    resultClass = cd.getMappingForAttributeName(name).getContainerPolicy().getContainerClass();
+                } else {
+                    ClassDescriptor referenceDiscriptor = cd.getMappingForAttributeName(name).getReferenceDescriptor();
+                    if (referenceDiscriptor != null) {
+                        resultClass = referenceDiscriptor.getJavaClass();
+                    } else {
+                        resultClass = Object.class;
+                    }
+                }
+            } else {
+                resultClass = internalType.getPropertyType(name);
+            }
+        } catch (DynamicException e) {
+            // property doesn't exist
+        }
+        return resultClass;
+    }
+
+    @Override
+    public Class getGenericTypeClass(String name) {
+        name = convertPropertyName(name);
+        Class resultClass = null;
+        if (internalType.getPropertyType(name) == null) {
+            if (cd.getMappingForAttributeName(name) instanceof XMLCompositeDirectCollectionMapping) {
+                resultClass = cd.getMappingForAttributeName(name).getFields().get(0).getType();
+
+            } else if (cd.getMappingForAttributeName(name) instanceof XMLCompositeCollectionMapping) {
+                resultClass = cd.getMappingForAttributeName(name).getReferenceDescriptor().getJavaClass();
+            }
+        }
+
+        return resultClass;
+    }
+
+    @Override
+    public Object getUnderlyingObject() {
+        return this.internalObject;
+    }
+
+    @Override
+    public String getChildName() {
+
+        String className = internalObject.getClass().getSimpleName();
+        String lowerHyphen = caseFormatStore.fromUpperCamelToLowerHyphen(className).orElseGet(() -> {
+            LOGGER.debug("Unable to find {} in the store for upper camel to lower hyphen", className);
+            return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, className);
+        });
+
+        if (this.isContainer()) {
+            String upperCamel = this.getGenericTypeClass(this.getProperties().iterator().next()).getSimpleName();
+
+            lowerHyphen = caseFormatStore.fromUpperCamelToLowerHyphen(upperCamel).orElseGet(() -> {
+                LOGGER.debug("Unable to find {} in the store for upper camel to lower hyphen", upperCamel);
+                return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, upperCamel);
+            });
+        }
+
+        return lowerHyphen;
+    }
+
+    @Override
+    public String getName() {
+        String className = internalObject.getClass().getSimpleName();
+        return caseFormatStore.fromUpperCamelToLowerHyphen(className).orElseGet(() -> {
+            LOGGER.debug("Unable to find {} in the store for upper camel to lower hyphen", className);
+            return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, className);
+        });
+    }
+
+    @Override
+    public String getObjectId() throws UnsupportedEncodingException {
+        String result = "";
+        String container = this.getMetadata(ObjectMetadata.CONTAINER);
+        if (this.isContainer()) {
+            result += "/" + this.getName();
+        } else {
+
+            if (container != null) {
+                result += "/" + container;
+            }
+            result += "/" + this.getDbName() + "/" + this.findKey();
+
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String findKey() throws UnsupportedEncodingException {
+        Set keys = null;
+        keys = this.getKeys();
+        List results = new ArrayList<>();
+        for (String key : keys) {
+            String value = UriUtils.encode(this.getValue(key).toString(), "UTF-8");
+            results.add(value);
+        }
+
+        return Joiner.on("/").join(results);
+    }
+
+    @Override
+    public String preProcessKey(String key) {
+        String result = "";
+        String[] split = key.split("/");
+        int i = 0;
+        for (i = split.length - 1; i >= 0; i--) {
+
+            if (jaxbContext.getDynamicType(split[i]) != null) {
+                break;
+
+            }
+
+        }
+        result = Joiner.on("/").join(Arrays.copyOfRange(split, 0, i));
+
+        return result;
+
+    }
+
+    @Override
+    public String marshal(MarshallerProperties properties) {
+        StringWriter result = new StringWriter();
         try {
             Marshaller marshaller = jaxbContext.createMarshaller();
-        	if (properties.getMediaType().equals(MediaType.APPLICATION_JSON_TYPE)) {
-				marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.MEDIA_TYPE, "application/json");
-		        marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_INCLUDE_ROOT, properties.getIncludeRoot());
-		        marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, properties.getWrapperAsArrayName());
-		        marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, false);
-        	}
-
- 	        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, properties.getFormatted());
-	        marshaller.marshal(this.internalObject, result);
-		} catch (JAXBException e) {
+            if (properties.getMediaType().equals(MediaType.APPLICATION_JSON_TYPE)) {
+                marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.MEDIA_TYPE,
+                        "application/json");
+                marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_INCLUDE_ROOT,
+                        properties.getIncludeRoot());
+                marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME,
+                        properties.getWrapperAsArrayName());
+                marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS,
+                        false);
+            }
+
+            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, properties.getFormatted());
+            marshaller.marshal(this.internalObject, result);
+        } catch (JAXBException e) {
             LOGGER.warn("Encountered an jaxb exception during marshalling ", LogFormatTools.getStackTop(e));
-		}
+        }
 
         return result.toString();
-	}
+    }
 
-	@Override
-	public ModelType getModelType() {
-		return ModelType.MOXY;
-	}
+    @Override
+    public ModelType getModelType() {
+        return ModelType.MOXY;
+    }
 
-	private String removeXPathDescriptor(String name) {
+    private String removeXPathDescriptor(String name) {
 
-		return name.replaceAll("/text\\(\\)", "");
-	}
+        return name.replaceAll("/text\\(\\)", "");
+    }
 
-	@Override
-	public String getMetadata(ObjectMetadata name) {
+    @Override
+    public String getMetadata(ObjectMetadata name) {
 
-		return (String)cd.getProperty(name.toString());
-	}
+        return (String) cd.getProperty(name.toString());
+    }
 
-	@Override
-	public SchemaVersion getVersion() {
+    @Override
+    public SchemaVersion getVersion() {
 
-		return this.version;
-	}
+        return this.version;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicate.java b/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicate.java
index 1682e511..8cc7025d 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicate.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicate.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 import java.util.function.BiPredicate;
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicates.java b/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicates.java
index e80bf43b..91e46d20 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicates.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/PropertyPredicates.java
@@ -17,60 +17,61 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.introspection;
 
-import org.onap.aai.schema.enums.PropertyMetadata;
+package org.onap.aai.introspection;
 
 import java.util.Map;
 import java.util.Set;
 
+import org.onap.aai.schema.enums.PropertyMetadata;
+
 public final class PropertyPredicates {
 
-	private PropertyPredicates() {
-		
-	}
-	
-	public static PropertyPredicate includeInTestGeneration() {
-		return (obj, prop) -> {
-			final Map map = obj.getPropertyMetadata(prop);
-			if (map.containsKey(PropertyMetadata.VISIBILITY)) {
-				return !(Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY))) 
-						|| Visibility.deployment.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY))));
-			}
-			if (map.containsKey("dataLocation")) {
-				return false;
-			}
-			return true;
-		};
-	}
-	 
-	public static PropertyPredicate isVisible() {
-		return (obj, prop) -> {
-			final Map map = obj.getPropertyMetadata(prop);
-			if (map.containsKey(PropertyMetadata.VISIBILITY)) {
-				return !Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY)));
-			}
-			return true;
-		};
-	}
-	
-	public static PropertyPredicate includeInExamples() {
-		return (obj, prop) -> {
-			final Map map = obj.getPropertyMetadata(prop);
-			if (map.containsKey(PropertyMetadata.VISIBILITY)) {
-				return !Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY)));
-			}
-			if (map.containsKey("dataLocation")) {
-				return false;
-			}
-			return true;
-		};
-	}
-	
-	public static PropertyPredicate isIndexed() {
-		return (obj, prop) -> {
-			Set indexed = obj.getIndexedProperties();
-			return indexed.contains(prop);
-		};
-	}
+    private PropertyPredicates() {
+
+    }
+
+    public static PropertyPredicate includeInTestGeneration() {
+        return (obj, prop) -> {
+            final Map map = obj.getPropertyMetadata(prop);
+            if (map.containsKey(PropertyMetadata.VISIBILITY)) {
+                return !(Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY)))
+                        || Visibility.deployment.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY))));
+            }
+            if (map.containsKey("dataLocation")) {
+                return false;
+            }
+            return true;
+        };
+    }
+
+    public static PropertyPredicate isVisible() {
+        return (obj, prop) -> {
+            final Map map = obj.getPropertyMetadata(prop);
+            if (map.containsKey(PropertyMetadata.VISIBILITY)) {
+                return !Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY)));
+            }
+            return true;
+        };
+    }
+
+    public static PropertyPredicate includeInExamples() {
+        return (obj, prop) -> {
+            final Map map = obj.getPropertyMetadata(prop);
+            if (map.containsKey(PropertyMetadata.VISIBILITY)) {
+                return !Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY)));
+            }
+            if (map.containsKey("dataLocation")) {
+                return false;
+            }
+            return true;
+        };
+    }
+
+    public static PropertyPredicate isIndexed() {
+        return (obj, prop) -> {
+            Set indexed = obj.getIndexedProperties();
+            return indexed.contains(prop);
+        };
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/Visibility.java b/aai-core/src/main/java/org/onap/aai/introspection/Visibility.java
index 71971c8a..127435a1 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/Visibility.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/Visibility.java
@@ -17,12 +17,10 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection;
 
 public enum Visibility {
 
-	internal,
-	external,
-	deployment,
-	all
+    internal, external, deployment, all
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/Wanderer.java b/aai-core/src/main/java/org/onap/aai/introspection/Wanderer.java
index d97bd2d6..0f5e5f96 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/Wanderer.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/Wanderer.java
@@ -17,66 +17,68 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.introspection;
 
-import org.onap.aai.exceptions.AAIException;
+package org.onap.aai.introspection;
 
 import java.util.List;
 
+import org.onap.aai.exceptions.AAIException;
+
 public interface Wanderer {
 
-	/**
-	 * Process primitive.
-	 *
-	 * @param propName the prop name
-	 * @param obj the obj
-	 */
-	public void processPrimitive(String propName, Introspector obj);
-	
-	/**
-	 * Process primitive list.
-	 *
-	 * @param propName the prop name
-	 * @param obj the obj
-	 */
-	public void processPrimitiveList(String propName, Introspector obj);
-	
-	/**
-	 * Process complex obj.
-	 *
-	 * @param obj the obj
-	 * @throws AAIException 
-	 */
-	public void processComplexObj(Introspector obj) throws AAIException;
-	
-	/**
-	 * Modify complex list.
-	 *
-	 * @param list the list
-	 * @param listReference TODO
-	 * @param parent the parent
-	 * @param child the child
-	 */
-	public void modifyComplexList(List list, List listReference, Introspector parent, Introspector child);
-	
-	/**
-	 * Creates the complex obj if null.
-	 *
-	 * @return true, if successful
-	 */
-	public default boolean createComplexObjIfNull() {
-		return false;
-	}
-	
-	/**
-	 * Creates the complex list size.
-	 *
-	 * @param parent the parent
-	 * @param child the child
-	 * @return the int
-	 */
-	public default int createComplexListSize(Introspector parent, Introspector child) {
-		return 0;
-	}
-	
+    /**
+     * Process primitive.
+     *
+     * @param propName the prop name
+     * @param obj the obj
+     */
+    public void processPrimitive(String propName, Introspector obj);
+
+    /**
+     * Process primitive list.
+     *
+     * @param propName the prop name
+     * @param obj the obj
+     */
+    public void processPrimitiveList(String propName, Introspector obj);
+
+    /**
+     * Process complex obj.
+     *
+     * @param obj the obj
+     * @throws AAIException
+     */
+    public void processComplexObj(Introspector obj) throws AAIException;
+
+    /**
+     * Modify complex list.
+     *
+     * @param list the list
+     * @param listReference TODO
+     * @param parent the parent
+     * @param child the child
+     */
+    public void modifyComplexList(List list, List listReference, Introspector parent,
+            Introspector child);
+
+    /**
+     * Creates the complex obj if null.
+     *
+     * @return true, if successful
+     */
+    public default boolean createComplexObjIfNull() {
+        return false;
+    }
+
+    /**
+     * Creates the complex list size.
+     *
+     * @param parent the parent
+     * @param child the child
+     * @return the int
+     */
+    public default int createComplexListSize(Introspector parent, Introspector child) {
+        return 0;
+    }
+
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnknownObjectException.java b/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnknownObjectException.java
index 4086b3cb..9f3fbe0d 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnknownObjectException.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnknownObjectException.java
@@ -17,25 +17,27 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class AAIUnknownObjectException extends AAIException {
 
-	private static final long serialVersionUID = -504200228742133774L;
+    private static final long serialVersionUID = -504200228742133774L;
 
-	public AAIUnknownObjectException() {}
+    public AAIUnknownObjectException() {
+    }
 
-	public AAIUnknownObjectException(String message) {
-		super("AAI_3000", message);
-	}
+    public AAIUnknownObjectException(String message) {
+        super("AAI_3000", message);
+    }
 
-	public AAIUnknownObjectException(Throwable cause) {
-		super("AAI_3000", cause);
-	}
+    public AAIUnknownObjectException(Throwable cause) {
+        super("AAI_3000", cause);
+    }
 
-	public AAIUnknownObjectException(String message, Throwable cause) {
-		super("AAI_3000", cause, message);
-	}
+    public AAIUnknownObjectException(String message, Throwable cause) {
+        super("AAI_3000", cause, message);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnmarshallingException.java b/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnmarshallingException.java
index 2eb3dad7..5dfc5d3e 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnmarshallingException.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/exceptions/AAIUnmarshallingException.java
@@ -17,25 +17,27 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class AAIUnmarshallingException extends AAIException {
 
-	private static final long serialVersionUID = -5615651557821878103L;
+    private static final long serialVersionUID = -5615651557821878103L;
 
-	public AAIUnmarshallingException() {}
+    public AAIUnmarshallingException() {
+    }
 
-	public AAIUnmarshallingException(String message) {
-		super("AAI_3000", message);
-	}
+    public AAIUnmarshallingException(String message) {
+        super("AAI_3000", message);
+    }
 
-	public AAIUnmarshallingException(Throwable cause) {
-		super("AAI_3000",cause);
-	}
+    public AAIUnmarshallingException(Throwable cause) {
+        super("AAI_3000", cause);
+    }
 
-	public AAIUnmarshallingException(String message, Throwable cause) {
-		super("AAI_3000", cause, message);
-	}
+    public AAIUnmarshallingException(String message, Throwable cause) {
+        super("AAI_3000", cause, message);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/generator/CreateExample.java b/aai-core/src/main/java/org/onap/aai/introspection/generator/CreateExample.java
index 3409d175..73f0a346 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/generator/CreateExample.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/generator/CreateExample.java
@@ -17,149 +17,151 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.introspection.generator;
 
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.*;
+package org.onap.aai.introspection.generator;
 
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.*;
+
 public class CreateExample implements Wanderer {
 
-	private SecureRandom rand = new SecureRandom();
-	private final long range = 100000000L;
-	private Loader loader = null;
-	private Introspector result = null;
-	private String objectName = null;
-	private List blacklist = null;
-	
-	/**
-	 * Instantiates a new creates the example.
-	 *
-	 * @param loader the loader
-	 * @param objectName the object name
-	 */
-	public CreateExample(Loader loader, String objectName) {
-
-		this.loader = loader;
-		this.objectName = objectName;
-		this.blacklist = new ArrayList<>();
-		
-	}
-
-	/**
-	 * Gets the example object.
-	 *
-	 * @return the example object
-	 * @throws AAIException 
-	 */
-	public Introspector getExampleObject() throws AAIException {
-		result = loader.introspectorFromName(objectName);
-		blacklist = new ArrayList<>();
-		blacklist.add("any");
-		blacklist.add("relationship-list");
-		if (!result.isContainer()) {
-			blacklist.add("resource-version");
-		}
-		IntrospectorWalker walker = new IntrospectorWalker(this, PropertyPredicates.includeInExamples());
-		
-		walker.preventCycles(true);
-		walker.setBlacklist(blacklist);
-		walker.walk(result);
-		//this.getExampleObject(result);
-		
-		return result;
-	}
-	
-	/**
-	 * Gets the value.
-	 *
-	 * @param property the property
-	 * @param type the type
-	 * @param suffix the suffix
-	 * @return the value
-	 */
-	private Object getValue(String property, String type, String suffix) {
-		long randLong = (long)(rand.nextDouble()*range);
-		Integer randInt = rand.nextInt(100000);
-		Integer randShrt = rand.nextInt(20000);
-		short randShort = randShrt.shortValue();
-	
-		Object newObj = null;
-		if (type.contains("java.lang.String")) {
-			newObj = "example-" + property + "-val-" + randInt + suffix;
-		} else if ( type.toLowerCase().equals("long") ||type.contains("java.lang.Long")) {
-			newObj = randLong;
-		} else if(type.toLowerCase().equals("boolean") || type.contains("java.lang.Boolean")){
-			newObj = Boolean.TRUE;
-		} else if ( type.toLowerCase().equals("int") || type.contains("java.lang.Integer")){
-			newObj = randInt;
-		}  else if ( type.toLowerCase().equals("short") || type.contains("java.lang.Short")){
-			newObj = randShort;
-		}
-		
-		return newObj;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void processPrimitive(String propName, Introspector obj) {
-		String 	propType = obj.getType(propName);
-
-		Object val = this.getValue(propName, propType, "");
-		obj.setValue(propName, val);		
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void processPrimitiveList(String propName, Introspector obj) {
-		int listSize = 2;
-		String propType = "";
-		List list = new ArrayList<>();
-		for (int i = 0; i < listSize; i++) {
-			propType = obj.getGenericType(propName);
-			Object val = this.getValue(propName, propType, "-" + (i + 1));
-			list.add(val);
-		}
-		obj.setValue(propName, list);		
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void processComplexObj(Introspector obj) {
-
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void modifyComplexList(List list, List listReference, Introspector parent, Introspector child) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean createComplexObjIfNull() {
-		return true;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int createComplexListSize(Introspector parent, Introspector child) {
-		return 1;
-	}
+    private SecureRandom rand = new SecureRandom();
+    private final long range = 100000000L;
+    private Loader loader = null;
+    private Introspector result = null;
+    private String objectName = null;
+    private List blacklist = null;
+
+    /**
+     * Instantiates a new creates the example.
+     *
+     * @param loader the loader
+     * @param objectName the object name
+     */
+    public CreateExample(Loader loader, String objectName) {
+
+        this.loader = loader;
+        this.objectName = objectName;
+        this.blacklist = new ArrayList<>();
+
+    }
+
+    /**
+     * Gets the example object.
+     *
+     * @return the example object
+     * @throws AAIException
+     */
+    public Introspector getExampleObject() throws AAIException {
+        result = loader.introspectorFromName(objectName);
+        blacklist = new ArrayList<>();
+        blacklist.add("any");
+        blacklist.add("relationship-list");
+        if (!result.isContainer()) {
+            blacklist.add("resource-version");
+        }
+        IntrospectorWalker walker = new IntrospectorWalker(this, PropertyPredicates.includeInExamples());
+
+        walker.preventCycles(true);
+        walker.setBlacklist(blacklist);
+        walker.walk(result);
+        // this.getExampleObject(result);
+
+        return result;
+    }
+
+    /**
+     * Gets the value.
+     *
+     * @param property the property
+     * @param type the type
+     * @param suffix the suffix
+     * @return the value
+     */
+    private Object getValue(String property, String type, String suffix) {
+        long randLong = (long) (rand.nextDouble() * range);
+        Integer randInt = rand.nextInt(100000);
+        Integer randShrt = rand.nextInt(20000);
+        short randShort = randShrt.shortValue();
+
+        Object newObj = null;
+        if (type.contains("java.lang.String")) {
+            newObj = "example-" + property + "-val-" + randInt + suffix;
+        } else if (type.toLowerCase().equals("long") || type.contains("java.lang.Long")) {
+            newObj = randLong;
+        } else if (type.toLowerCase().equals("boolean") || type.contains("java.lang.Boolean")) {
+            newObj = Boolean.TRUE;
+        } else if (type.toLowerCase().equals("int") || type.contains("java.lang.Integer")) {
+            newObj = randInt;
+        } else if (type.toLowerCase().equals("short") || type.contains("java.lang.Short")) {
+            newObj = randShort;
+        }
+
+        return newObj;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void processPrimitive(String propName, Introspector obj) {
+        String propType = obj.getType(propName);
+
+        Object val = this.getValue(propName, propType, "");
+        obj.setValue(propName, val);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void processPrimitiveList(String propName, Introspector obj) {
+        int listSize = 2;
+        String propType = "";
+        List list = new ArrayList<>();
+        for (int i = 0; i < listSize; i++) {
+            propType = obj.getGenericType(propName);
+            Object val = this.getValue(propName, propType, "-" + (i + 1));
+            list.add(val);
+        }
+        obj.setValue(propName, list);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void processComplexObj(Introspector obj) {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void modifyComplexList(List list, List listReference, Introspector parent,
+            Introspector child) {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean createComplexObjIfNull() {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int createComplexListSize(Introspector parent, Introspector child) {
+        return 1;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataCopy.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataCopy.java
index 8a8d74f9..6a6ee4c1 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataCopy.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataCopy.java
@@ -17,8 +17,20 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
@@ -30,59 +42,51 @@ import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Optional;
+public class DataCopy extends SideEffect {
 
+    public DataCopy(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
+        super(obj, self, dbEngine, serializer);
+    }
 
-public class DataCopy extends SideEffect {
+    @Override
+    protected void processURI(Optional completeUri, Entry entry)
+            throws URISyntaxException, UnsupportedEncodingException, AAIException {
+        if (completeUri.isPresent()) {
+            URI uri = new URI(completeUri.get());
+            MultivaluedMap map = URITools.getQueryMap(uri);
+            QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
+            List results = uriQuery.getQueryBuilder().toList();
+            Introspector resultObj = this.latestLoader.introspectorFromName(uriQuery.getResultType());
+            if (results.size() == 1) {
+                serializer.dbToObject(Collections.singletonList(results.get(0)), resultObj, 0, true, "false");
+                try {
+                    obj.setValue(entry.getKey(), Objects.requireNonNull(resultObj.getValue(uri.getFragment()),
+                            uri.getFragment() + " was null"));
+                } catch (NullPointerException e) {
+                    throw new AAIMissingRequiredPropertyException(
+                            "property " + uri.getFragment() + " not found at " + uri);
+                }
+            } else {
+                if (results.isEmpty()) {
+                    throw new AAIException("AAI_6114", "object located at " + uri + " not found");
+                } else if (results.size() > 1) {
+                    throw new AAIMultiplePropertiesException(
+                            "multiple values of " + entry.getKey() + " found when searching " + uri);
+                }
+            }
+        } else {
+            // skip processing because no required properties were specified
+        }
+    }
 
-	
-	public DataCopy(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
-		super(obj, self, dbEngine, serializer);
-	}
-	
-	@Override
-	protected void processURI(Optional completeUri, Entry entry) throws URISyntaxException, UnsupportedEncodingException, AAIException {
-		if (completeUri.isPresent()) {
-			URI uri = new URI(completeUri.get());
-			MultivaluedMap map = URITools.getQueryMap(uri);
-			QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
-			List results = uriQuery.getQueryBuilder().toList();
-			Introspector resultObj = this.latestLoader.introspectorFromName(uriQuery.getResultType());
-			if (results.size() == 1) {
-				serializer.dbToObject(Collections.singletonList(results.get(0)), resultObj, 0, true, "false");
-				try {
-					obj.setValue(entry.getKey(), Objects.requireNonNull(resultObj.getValue(uri.getFragment()), uri.getFragment() + " was null"));
-				} catch (NullPointerException e) {
-					throw new AAIMissingRequiredPropertyException("property " + uri.getFragment() + " not found at " + uri);
-				}
- 			} else {
-				if (results.isEmpty()) {
-					throw new AAIException("AAI_6114", "object located at " + uri + " not found");
-				} else if (results.size() > 1) {
-					throw new AAIMultiplePropertiesException("multiple values of " + entry.getKey() + " found when searching " + uri);
-				}
-			}
-		} else {
-			//skip processing because no required properties were specified
-		}
-	}
+    @Override
+    protected PropertyMetadata getPropertyMetadata() {
+        return PropertyMetadata.DATA_COPY;
+    }
 
-	@Override
-	protected PropertyMetadata getPropertyMetadata() {
-		return PropertyMetadata.DATA_COPY;
-	}
+    @Override
+    protected boolean replaceWithWildcard() {
+        return false;
+    }
 
-	@Override
-	protected boolean replaceWithWildcard() {
-		return false;
-	}
-	
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkReader.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkReader.java
index 7a35910d..42b361dd 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkReader.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkReader.java
@@ -17,8 +17,21 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.regex.Matcher;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.exceptions.AAIException;
@@ -30,67 +43,59 @@ import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.regex.Matcher;
-
 public class DataLinkReader extends SideEffect {
-	
-	public DataLinkReader(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
-		super(obj, self, dbEngine, serializer);
-	}
-	
-	@Override
-	protected boolean replaceWithWildcard() {
-		return true;
-	}
 
-	@Override
-	protected PropertyMetadata getPropertyMetadata() {
-		return PropertyMetadata.DATA_LINK;
-	}
+    public DataLinkReader(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
+        super(obj, self, dbEngine, serializer);
+    }
+
+    @Override
+    protected boolean replaceWithWildcard() {
+        return true;
+    }
+
+    @Override
+    protected PropertyMetadata getPropertyMetadata() {
+        return PropertyMetadata.DATA_LINK;
+    }
+
+    @Override
+    protected void processURI(Optional completeUri, Entry entry)
+            throws URISyntaxException, UnsupportedEncodingException, AAIException {
+
+        if (completeUri.isPresent()) {
+            URI uri = new URI(completeUri.get());
+            MultivaluedMap map = URITools.getQueryMap(uri);
+            QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
+            List results =
+                    uriQuery.getQueryBuilder().getVerticesByProperty(AAIProperties.LINKED, true).toList();
+            if (results.size() == 1) {
+                if (results.get(0).property(AAIProperties.LINKED).orElse(false)
+                        && obj.getValue(entry.getKey()) == null) {
+                    obj.setValue(entry.getKey(), results.get(0).property(entry.getKey()).orElse(null));
+                }
+            } else {
+                // log something about not being able to return any values because there was more than one
+            }
+        }
+    }
 
-	@Override
-	protected void processURI(Optional completeUri, Entry entry)
-			throws URISyntaxException, UnsupportedEncodingException, AAIException {
+    /**
+     * always fuzzy search on reads
+     */
+    @Override
+    protected Map findProperties(Introspector obj, String uriString)
+            throws AAIMissingRequiredPropertyException {
 
-		if (completeUri.isPresent()) {
-			URI uri = new URI(completeUri.get());
-			MultivaluedMap map = URITools.getQueryMap(uri);
-			QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
-			List results = uriQuery.getQueryBuilder().getVerticesByProperty(AAIProperties.LINKED, true).toList();
-			if (results.size() == 1) {
-				if (results.get(0).property(AAIProperties.LINKED).orElse(false) && obj.getValue(entry.getKey()) == null) {
-					obj.setValue(entry.getKey(), results.get(0).property(entry.getKey()).orElse(null));
-				}
-			} else {
-			//log something about not being able to return any values because there was more than one
-			}
-		}
-	}
-	
-	/**
-	 * always fuzzy search on reads
-	 */
-	@Override
-	protected Map findProperties(Introspector obj, String uriString) throws AAIMissingRequiredPropertyException {
-		
-		final Map result = new HashMap<>();
-		Matcher m = template.matcher(uriString);
-		while (m.find()) {
-			String propName = m.group(1);
-			if (replaceWithWildcard()) {
-				result.put(propName, "*");
-			}
-		}
-		return result;
-	}
+        final Map result = new HashMap<>();
+        Matcher m = template.matcher(uriString);
+        while (m.find()) {
+            String propName = m.group(1);
+            if (replaceWithWildcard()) {
+                result.put(propName, "*");
+            }
+        }
+        return result;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkWriter.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkWriter.java
index 1c15c8b3..16f30531 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkWriter.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/DataLinkWriter.java
@@ -17,8 +17,18 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Optional;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.exceptions.AAIException;
@@ -31,78 +41,75 @@ import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Optional;
-
 public class DataLinkWriter extends SideEffect {
 
-	public DataLinkWriter(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
-		super(obj, self, dbEngine, serializer);
-	}
+    public DataLinkWriter(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
+        super(obj, self, dbEngine, serializer);
+    }
+
+    @Override
+    protected PropertyMetadata getPropertyMetadata() {
+        return PropertyMetadata.DATA_LINK;
+    }
 
-	@Override
-	protected PropertyMetadata getPropertyMetadata() {
-		return PropertyMetadata.DATA_LINK;
-	}
+    @Override
+    protected void processURI(Optional completeUri, Entry entry)
+            throws URISyntaxException, UnsupportedEncodingException, AAIException {
+        if (completeUri.isPresent()) {
+            URI uri = new URI(completeUri.get());
+            MultivaluedMap map = URITools.getQueryMap(uri);
+            QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
+            List results = uriQuery.getQueryBuilder().toList();
+            if (results.size() == 1) {
+                if (results.get(0).property(AAIProperties.LINKED).orElse(false)
+                        && obj.getValue(entry.getKey()) == null) {
+                    // delete vertex because property was removed
+                    serializer.delete(results.get(0), "", false);
+                } else {
+                    // link vertex that already exists
+                    this.addLinkedProperty(results.get(0));
+                }
+            } else {
+                if (results.isEmpty()) {
+                    // locate previously linked vertex
+                    List linkedVertices = uriQuery.getQueryBuilder().getContainerQuery()
+                            .getVerticesByProperty(AAIProperties.LINKED, true).toList();
+                    if (!linkedVertices.isEmpty()) {
+                        if (linkedVertices.size() > 1) {
+                            throw new AAIMultiplePropertiesException(
+                                    "multiple vertices found for single cardinality propery found when searching "
+                                            + uri);
+                        } else {
+                            // found one, remove the linked property because it didn't match the uri
+                            linkedVertices.get(0).property(AAIProperties.LINKED).remove();
+                        }
+                    }
+                    if (obj.getValue(entry.getKey()) != null) {
+                        // add new vertex to database if we have values
+                        URIToObject parser = new URIToObject(this.latestLoader, uri);
+                        Introspector resultObj = parser.getEntity();
+                        Vertex newV = serializer.createNewVertex(resultObj);
+                        serializer.serializeToDb(resultObj, newV, uriQuery, completeUri.get(),
+                                this.latestLoader.getVersion().toString());
+                        this.addLinkedProperty(newV);
+                    }
+                } else if (results.size() > 1) {
+                    throw new AAIMultiplePropertiesException(
+                            "multiple values of " + entry.getKey() + " found when searching " + uri);
+                }
+            }
+        } else {
+            // skip processing because no required properties were specified
+        }
+    }
 
-	@Override
-	protected void processURI(Optional completeUri, Entry entry)
-			throws URISyntaxException, UnsupportedEncodingException, AAIException {
-		if (completeUri.isPresent()) {
-			URI uri = new URI(completeUri.get());
-			MultivaluedMap map = URITools.getQueryMap(uri);
-			QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
-			List results = uriQuery.getQueryBuilder().toList();
-			if (results.size() == 1) {
-				if (results.get(0).property(AAIProperties.LINKED).orElse(false) && obj.getValue(entry.getKey()) == null) {
-					//delete vertex because property was removed
-					serializer.delete(results.get(0), "", false);
-				} else {
-					//link vertex that already exists
-					this.addLinkedProperty(results.get(0));
-				}
- 			} else {
-				if (results.isEmpty()) {
-					//locate previously linked vertex
-					List linkedVertices = uriQuery.getQueryBuilder().getContainerQuery().getVerticesByProperty(AAIProperties.LINKED, true).toList();
-					if (!linkedVertices.isEmpty()) {
-						if (linkedVertices.size() > 1) {
-							throw new AAIMultiplePropertiesException("multiple vertices found for single cardinality propery found when searching " + uri);
-						} else {
-							//found one, remove the linked property because it didn't match the uri
-							linkedVertices.get(0).property(AAIProperties.LINKED).remove();
-						}
-					}
-					if (obj.getValue(entry.getKey()) != null) {
-						//add new vertex to database if we have values
-						URIToObject parser = new URIToObject(this.latestLoader, uri);
-						Introspector resultObj = parser.getEntity();
-						Vertex newV = serializer.createNewVertex(resultObj);
-						serializer.serializeToDb(resultObj, newV, uriQuery, completeUri.get(), this.latestLoader.getVersion().toString());
-						this.addLinkedProperty(newV);
-					}
-				} else if (results.size() > 1) {
-					throw new AAIMultiplePropertiesException("multiple values of " + entry.getKey() + " found when searching " + uri);
-				}
-			}
-		} else {
-			//skip processing because no required properties were specified
-		}
-	}
-	
-	@Override
-	protected boolean replaceWithWildcard() {
-		return true;
-	}
-	
-	private void addLinkedProperty(Vertex v) {
-		v.property(AAIProperties.LINKED, true);
-	}
+    @Override
+    protected boolean replaceWithWildcard() {
+        return true;
+    }
 
+    private void addLinkedProperty(Vertex v) {
+        v.property(AAIProperties.LINKED, true);
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/PrivateEdge.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/PrivateEdge.java
index 5b719e33..f4f0bfac 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/PrivateEdge.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/PrivateEdge.java
@@ -17,16 +17,28 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect;
 
 import com.google.common.collect.Multimap;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.*;
+import java.util.Map.Entry;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.onap.aai.config.SpringContextAware;
 import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.edges.EdgeRule;
 import org.onap.aai.edges.EdgeRuleQuery;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.edges.exceptions.AmbiguousRuleChoiceException;
 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.exceptions.AAIException;
@@ -36,20 +48,10 @@ import org.onap.aai.parsers.query.QueryParser;
 import org.onap.aai.restcore.util.URITools;
 import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.serialization.db.DBSerializer;
-import org.onap.aai.edges.EdgeRule;
-import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.serialization.db.EdgeSerializer;
 import org.onap.aai.serialization.db.exceptions.EdgeMultiplicityException;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.*;
-import java.util.Map.Entry;
-
-
 public class PrivateEdge extends SideEffect {
 
     public PrivateEdge(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
@@ -57,16 +59,18 @@ public class PrivateEdge extends SideEffect {
     }
 
     @Override
-    protected void processURI(Optional completeUri, Entry entry) throws URISyntaxException, UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
+    protected void processURI(Optional completeUri, Entry entry) throws URISyntaxException,
+            UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
         if (completeUri.isPresent()) {
             process(completeUri, entry);
         } else {
             // Check if the vertex self has the template keys or the db aliased keys
             // If it does check if the self vertex has a edge to that model
             // If it does, then remove the edge since the update happened and doesn't have required props anymore
-			// "service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}"
+            // "service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}"
             // If the vertex does have
-        	Loader loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, obj.getVersion());
+            Loader loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY,
+                    obj.getVersion());
             Introspector introspector = loader.introspectorFromName(obj.getDbName());
             List vertices = new ArrayList<>();
             vertices.add(self);
@@ -76,8 +80,9 @@ public class PrivateEdge extends SideEffect {
         }
     }
 
-    private void process(Optional completeUri, Entry entry) throws URISyntaxException, UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
-        if(completeUri.isPresent()){
+    private void process(Optional completeUri, Entry entry) throws URISyntaxException,
+            UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
+        if (completeUri.isPresent()) {
             URI uri = new URI(completeUri.get());
             MultivaluedMap map = URITools.getQueryMap(uri);
             QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map);
@@ -88,34 +93,39 @@ public class PrivateEdge extends SideEffect {
 
                 if (otherVProperty.isPresent()) {
 
-                    EdgeRuleQuery edgeQuery = new EdgeRuleQuery.Builder(obj.getName(), otherVProperty.value().toString()).edgeType(EdgeType.COUSIN).setPrivate(true).build();
+                    EdgeRuleQuery edgeQuery =
+                            new EdgeRuleQuery.Builder(obj.getName(), otherVProperty.value().toString())
+                                    .edgeType(EdgeType.COUSIN).setPrivate(true).build();
                     EdgeIngestor edgeIngestor = serializer.getEdgeIngestor();
                     EdgeSerializer edgeSerializer = serializer.getEdgeSeriailizer();
 
                     Multimap edgeRulesMap = edgeIngestor.getRules(edgeQuery);
 
                     if (edgeRulesMap.isEmpty()) {
-                        String message = String.format("Unable to find edge between %s and %s", obj.getName(), otherVProperty.value().toString());
+                        String message = String.format("Unable to find edge between %s and %s", obj.getName(),
+                                otherVProperty.value().toString());
                         throw new AAIException("AAI_6127", message);
                     } else if (edgeRulesMap.size() > 1) {
-                        String message = String.format("Found multiple edges between %s and %s", obj.getName(), otherVProperty.value().toString());
+                        String message = String.format("Found multiple edges between %s and %s", obj.getName(),
+                                otherVProperty.value().toString());
                         throw new EdgeMultiplicityException(message);
                     }
 
-
                     for (Entry edgeEntry : edgeRulesMap.entries()) {
                         EdgeRule edgeRule = edgeIngestor.getRule(edgeQuery);
                         Iterator edges = self.edges(edgeRule.getDirection(), edgeRule.getLabel().toString());
-                        if(edges.hasNext()){
+                        if (edges.hasNext()) {
                             Edge edge = edges.next();
                             EdgeStatus status = checkStatus(obj, self);
-                            switch(status){
+                            switch (status) {
                                 case CREATED:
-                                    edgeSerializer.addPrivateEdge(this.dbEngine.asAdmin().getTraversalSource(), self, otherVertex, edgeRule.getLabel());
+                                    edgeSerializer.addPrivateEdge(this.dbEngine.asAdmin().getTraversalSource(), self,
+                                            otherVertex, edgeRule.getLabel());
                                     break;
                                 case MODIFIED:
                                     edge.remove();
-                                    edgeSerializer.addPrivateEdge(this.dbEngine.asAdmin().getTraversalSource(), self, otherVertex, edgeRule.getLabel());
+                                    edgeSerializer.addPrivateEdge(this.dbEngine.asAdmin().getTraversalSource(), self,
+                                            otherVertex, edgeRule.getLabel());
                                     break;
                                 case REMOVED:
                                     edge.remove();
@@ -124,7 +134,8 @@ public class PrivateEdge extends SideEffect {
                                     break;
                             }
                         } else {
-                            edgeSerializer.addPrivateEdge(this.dbEngine.asAdmin().getTraversalSource(), self, otherVertex, edgeRule.getLabel());
+                            edgeSerializer.addPrivateEdge(this.dbEngine.asAdmin().getTraversalSource(), self,
+                                    otherVertex, edgeRule.getLabel());
                         }
                     }
                 }
@@ -132,49 +143,47 @@ public class PrivateEdge extends SideEffect {
                 if (results.isEmpty()) {
                     throw new AAIException("AAI_6114", "object located at " + uri + " not found");
                 } else if (results.size() > 1) {
-                    throw new AAIMultiplePropertiesException("multiple values of " + entry.getKey() + " found when searching " + uri);
+                    throw new AAIMultiplePropertiesException(
+                            "multiple values of " + entry.getKey() + " found when searching " + uri);
                 }
             }
         }
     }
 
     public enum EdgeStatus {
-        CREATED,
-        REMOVED,
-        MODIFIED,
-        UNCHANGED
+        CREATED, REMOVED, MODIFIED, UNCHANGED
     }
 
     private EdgeStatus checkStatus(Introspector obj, Vertex self) {
 
-        for(String key : templateKeys){
+        for (String key : templateKeys) {
             String currentObjValue = obj.getValue(key);
             Map map = obj.getPropertyMetadata(key);
             String oldVertexValue = null;
 
-            if(map.containsKey(PropertyMetadata.DB_ALIAS)){
+            if (map.containsKey(PropertyMetadata.DB_ALIAS)) {
                 oldVertexValue = self.property(key + AAIProperties.DB_ALIAS_SUFFIX).orElse(null);
             } else {
                 oldVertexValue = self.property(key).orElse(null);
             }
 
-            if(currentObjValue == null && oldVertexValue == null){
+            if (currentObjValue == null && oldVertexValue == null) {
                 continue;
             }
 
-            if(currentObjValue == null){
-                if(oldVertexValue != null){
+            if (currentObjValue == null) {
+                if (oldVertexValue != null) {
                     return EdgeStatus.REMOVED;
                 }
             }
 
-            if(oldVertexValue == null){
-                if(currentObjValue != null){
+            if (oldVertexValue == null) {
+                if (currentObjValue != null) {
                     return EdgeStatus.CREATED;
                 }
             }
 
-            if(!oldVertexValue.equals(currentObjValue)){
+            if (!oldVertexValue.equals(currentObjValue)) {
                 return EdgeStatus.MODIFIED;
             }
         }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffect.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffect.java
index 891876af..d86c18a0 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffect.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffect.java
@@ -17,10 +17,19 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.config.SpringContextAware;
 import org.onap.aai.db.props.AAIProperties;
@@ -34,109 +43,108 @@ import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 import org.onap.aai.setup.SchemaVersions;
 
-
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 public abstract class SideEffect {
 
-	protected static final Pattern template = Pattern.compile("\\{(.*?)\\}");
-	private static final EELFLogger logger = EELFManager.getInstance().getLogger(SideEffect.class);
-
-	protected final Introspector obj;
-	protected final TransactionalGraphEngine dbEngine;
-	protected final DBSerializer serializer;
-	protected final Loader latestLoader;
-	protected final Vertex self;
-
-	protected Set templateKeys = new HashSet<>();
-
-	public SideEffect (Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
-		this.obj = obj;
-		this.dbEngine = dbEngine;
-		this.serializer = serializer;
-		this.self = self;
-		this.latestLoader = LoaderUtil.getLatestVersion();
-	}
-
-	protected void execute() throws UnsupportedEncodingException, URISyntaxException, AAIException {
-		final Map properties = this.findPopertiesWithMetadata(obj, this.getPropertyMetadata());
-		for (Entry entry : properties.entrySet()) {
-			Optional populatedUri = this.replaceTemplates(obj, entry.getValue());
-			Optional completeUri = this.resolveRelativePath(populatedUri);
-			try {
-				this.processURI(completeUri, entry);
-			} catch (EdgeRuleNotFoundException | AmbiguousRuleChoiceException e) {
-			    logger.warn("Unable to execute the side effect {} due to ", e, this.getClass().getName());
-			}
-		}
-	}
-
-	protected Map findPopertiesWithMetadata(Introspector obj, PropertyMetadata metadata) {
-		final Map result = new HashMap<>();
-		for (String prop : obj.getProperties()) {
-			final Map map = obj.getPropertyMetadata(prop);
-			if (map.containsKey(metadata)) {
-				result.put(prop, map.get(metadata));
-			}
-		}
-		return result;
-	}
-
-	protected Map findProperties(Introspector obj, String uriString) throws AAIMissingRequiredPropertyException {
-
-		final Map result = new HashMap<>();
-		final Set missing = new LinkedHashSet<>();
-		Matcher m = template.matcher(uriString);
-		int properties = 0;
-		while (m.find()) {
-			String propName = m.group(1);
-			String value = obj.getValue(propName);
-			properties++;
-			if (value != null) {
-				result.put(propName, value);
-			} else {
-				if (replaceWithWildcard()) {
-					result.put(propName, "*");
-				}
-				missing.add(propName);
-			}
-		}
-
-		if (!missing.isEmpty() && (properties != missing.size())) {
-			throw new AAIMissingRequiredPropertyException("Cannot complete " + this.getPropertyMetadata().toString() + " uri. Missing properties " + missing);
-		}
-		return result;
-	}
-
-	protected Optional replaceTemplates(Introspector obj, String uriString) throws AAIMissingRequiredPropertyException {
-		String result = uriString;
-		final Map propMap = this.findProperties(obj, uriString);
-		if (propMap.isEmpty()) {
-			return Optional.empty();
-		}
-		for (Entry entry : propMap.entrySet()) {
-			templateKeys.add(entry.getKey());
-			result = result.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue());
-		}
-		//drop out wildcards if they exist
-		result = result.replaceFirst("/[^/]+?(?:/\\*)+", "");
-		return Optional.of(result);
-	}
-
-	private Optional resolveRelativePath(Optional populatedUri) throws UnsupportedEncodingException {
-		if (!populatedUri.isPresent()) {
-			return Optional.empty();
-		} else {
-			return Optional.of(populatedUri.get().replaceFirst("\\./", this.serializer.getURIForVertex(self) + "/"));
-		}
-	}
-
-	protected abstract boolean replaceWithWildcard();
-	protected abstract PropertyMetadata getPropertyMetadata();
-	protected abstract void processURI(Optional completeUri, Entry entry) throws URISyntaxException, UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException;
+    protected static final Pattern template = Pattern.compile("\\{(.*?)\\}");
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(SideEffect.class);
+
+    protected final Introspector obj;
+    protected final TransactionalGraphEngine dbEngine;
+    protected final DBSerializer serializer;
+    protected final Loader latestLoader;
+    protected final Vertex self;
+
+    protected Set templateKeys = new HashSet<>();
+
+    public SideEffect(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
+        this.obj = obj;
+        this.dbEngine = dbEngine;
+        this.serializer = serializer;
+        this.self = self;
+        this.latestLoader = LoaderUtil.getLatestVersion();
+    }
+
+    protected void execute() throws UnsupportedEncodingException, URISyntaxException, AAIException {
+        final Map properties = this.findPopertiesWithMetadata(obj, this.getPropertyMetadata());
+        for (Entry entry : properties.entrySet()) {
+            Optional populatedUri = this.replaceTemplates(obj, entry.getValue());
+            Optional completeUri = this.resolveRelativePath(populatedUri);
+            try {
+                this.processURI(completeUri, entry);
+            } catch (EdgeRuleNotFoundException | AmbiguousRuleChoiceException e) {
+                logger.warn("Unable to execute the side effect {} due to ", e, this.getClass().getName());
+            }
+        }
+    }
+
+    protected Map findPopertiesWithMetadata(Introspector obj, PropertyMetadata metadata) {
+        final Map result = new HashMap<>();
+        for (String prop : obj.getProperties()) {
+            final Map map = obj.getPropertyMetadata(prop);
+            if (map.containsKey(metadata)) {
+                result.put(prop, map.get(metadata));
+            }
+        }
+        return result;
+    }
+
+    protected Map findProperties(Introspector obj, String uriString)
+            throws AAIMissingRequiredPropertyException {
+
+        final Map result = new HashMap<>();
+        final Set missing = new LinkedHashSet<>();
+        Matcher m = template.matcher(uriString);
+        int properties = 0;
+        while (m.find()) {
+            String propName = m.group(1);
+            String value = obj.getValue(propName);
+            properties++;
+            if (value != null) {
+                result.put(propName, value);
+            } else {
+                if (replaceWithWildcard()) {
+                    result.put(propName, "*");
+                }
+                missing.add(propName);
+            }
+        }
+
+        if (!missing.isEmpty() && (properties != missing.size())) {
+            throw new AAIMissingRequiredPropertyException(
+                    "Cannot complete " + this.getPropertyMetadata().toString() + " uri. Missing properties " + missing);
+        }
+        return result;
+    }
+
+    protected Optional replaceTemplates(Introspector obj, String uriString)
+            throws AAIMissingRequiredPropertyException {
+        String result = uriString;
+        final Map propMap = this.findProperties(obj, uriString);
+        if (propMap.isEmpty()) {
+            return Optional.empty();
+        }
+        for (Entry entry : propMap.entrySet()) {
+            templateKeys.add(entry.getKey());
+            result = result.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue());
+        }
+        // drop out wildcards if they exist
+        result = result.replaceFirst("/[^/]+?(?:/\\*)+", "");
+        return Optional.of(result);
+    }
+
+    private Optional resolveRelativePath(Optional populatedUri) throws UnsupportedEncodingException {
+        if (!populatedUri.isPresent()) {
+            return Optional.empty();
+        } else {
+            return Optional.of(populatedUri.get().replaceFirst("\\./", this.serializer.getURIForVertex(self) + "/"));
+        }
+    }
+
+    protected abstract boolean replaceWithWildcard();
+
+    protected abstract PropertyMetadata getPropertyMetadata();
+
+    protected abstract void processURI(Optional completeUri, Entry entry)
+            throws URISyntaxException, UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException,
+            AmbiguousRuleChoiceException;
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunner.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunner.java
index 0d70c382..ffd9a8c8 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunner.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunner.java
@@ -17,15 +17,11 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.serialization.db.DBSerializer;
-import org.onap.aai.serialization.engines.TransactionalGraphEngine;
 
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
@@ -33,68 +29,76 @@ import java.net.URISyntaxException;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.serialization.db.DBSerializer;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
 public class SideEffectRunner {
 
-	protected final TransactionalGraphEngine dbEngine;
-	protected final DBSerializer serializer;
-	protected final Set> sideEffects;
-	protected SideEffectRunner(Builder builder) {
-		this.dbEngine = builder.getDbEngine();
-		this.serializer = builder.getSerializer();
-		this.sideEffects = builder.getSideEffects();
-	}
-	
-	public void execute(Introspector obj, Vertex self) throws AAIException {
-		
-		for (Class se : sideEffects) {
-			try {
-				se.getConstructor(Introspector.class, Vertex.class, TransactionalGraphEngine.class, DBSerializer.class)
-				.newInstance(obj, self, dbEngine, serializer).execute();
-			} catch (UnsupportedEncodingException | InstantiationException | IllegalAccessException
-					| IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException
-					| URISyntaxException e) {
-				throw new AAIException("strange exception", e);
-			}
-		}		
-	}
-
-	public static class Builder {
-		
-		private final TransactionalGraphEngine dbEngine;
-		private final DBSerializer serializer;
-		private final Set> sideEffects;
-		
-		public Builder(final TransactionalGraphEngine dbEngine, final DBSerializer serializer) {
-			this.dbEngine = dbEngine;
-			this.serializer = serializer;
-			this.sideEffects = new LinkedHashSet<>();
-		}
-		
-		public Builder addSideEffect(Class se) {
-			sideEffects.add(se);
-			return this;
-		}
-		
-		public Builder addSideEffects(Class... sideEffects) {
-			for (Class se : sideEffects) {
-				this.addSideEffect(se);
-			}
-			return this;
-		}
-		
-		public SideEffectRunner build() {
-			return new SideEffectRunner(this);
-		}
-		protected TransactionalGraphEngine getDbEngine() {
-			return dbEngine;
-		}
-
-		protected DBSerializer getSerializer() {
-			return serializer;
-		}
-
-		protected Set> getSideEffects() {
-			return sideEffects;
-		}
-	}
+    protected final TransactionalGraphEngine dbEngine;
+    protected final DBSerializer serializer;
+    protected final Set> sideEffects;
+
+    protected SideEffectRunner(Builder builder) {
+        this.dbEngine = builder.getDbEngine();
+        this.serializer = builder.getSerializer();
+        this.sideEffects = builder.getSideEffects();
+    }
+
+    public void execute(Introspector obj, Vertex self) throws AAIException {
+
+        for (Class se : sideEffects) {
+            try {
+                se.getConstructor(Introspector.class, Vertex.class, TransactionalGraphEngine.class, DBSerializer.class)
+                        .newInstance(obj, self, dbEngine, serializer).execute();
+            } catch (UnsupportedEncodingException | InstantiationException | IllegalAccessException
+                    | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException
+                    | URISyntaxException e) {
+                throw new AAIException("strange exception", e);
+            }
+        }
+    }
+
+    public static class Builder {
+
+        private final TransactionalGraphEngine dbEngine;
+        private final DBSerializer serializer;
+        private final Set> sideEffects;
+
+        public Builder(final TransactionalGraphEngine dbEngine, final DBSerializer serializer) {
+            this.dbEngine = dbEngine;
+            this.serializer = serializer;
+            this.sideEffects = new LinkedHashSet<>();
+        }
+
+        public Builder addSideEffect(Class se) {
+            sideEffects.add(se);
+            return this;
+        }
+
+        public Builder addSideEffects(Class... sideEffects) {
+            for (Class se : sideEffects) {
+                this.addSideEffect(se);
+            }
+            return this;
+        }
+
+        public SideEffectRunner build() {
+            return new SideEffectRunner(this);
+        }
+
+        protected TransactionalGraphEngine getDbEngine() {
+            return dbEngine;
+        }
+
+        protected DBSerializer getSerializer() {
+            return serializer;
+        }
+
+        protected Set> getSideEffects() {
+            return sideEffects;
+        }
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunnerHelper.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunnerHelper.java
index 4daefe4c..160a91ea 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunnerHelper.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/SideEffectRunnerHelper.java
@@ -17,13 +17,8 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.introspection.sideeffect;
 
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.introspection.Wanderer;
-import org.onap.aai.serialization.db.DBSerializer;
-import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+package org.onap.aai.introspection.sideeffect;
 
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
@@ -31,54 +26,62 @@ import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Set;
 
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Wanderer;
+import org.onap.aai.serialization.db.DBSerializer;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
 class SideEffectRunnerHelper implements Wanderer {
 
-	
-	protected final TransactionalGraphEngine dbEngine;
-	protected final DBSerializer serializer;
-	protected final Set> sideEffects;
-	protected SideEffectRunnerHelper(final TransactionalGraphEngine dbEngine, final DBSerializer serializer, final Set> sideEffects) {
-		this.dbEngine = dbEngine;
-		this.serializer = serializer;
-		this.sideEffects = sideEffects;
-	}
-	
-	private void runSideEffects(Introspector obj) throws AAIException {
-		for (Class se : sideEffects) {
-			try {
-				se.getConstructor(Introspector.class, TransactionalGraphEngine.class, DBSerializer.class)
-				.newInstance(obj, dbEngine, serializer).execute();
-			} catch (UnsupportedEncodingException | InstantiationException | IllegalAccessException
-					| IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException
-					| URISyntaxException e) {
-				throw new AAIException("strange exception", e);
-			}
-		}
-	}
-	@Override
-	public void processPrimitive(String propName, Introspector obj) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void processPrimitiveList(String propName, Introspector obj) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void processComplexObj(Introspector obj) throws AAIException {
-		
-		runSideEffects(obj);
-	
-	}
-
-	@Override
-	public void modifyComplexList(List list, List listReference, Introspector parent,
-			Introspector child) {
-		// TODO Auto-generated method stub
-
-	}
+    protected final TransactionalGraphEngine dbEngine;
+    protected final DBSerializer serializer;
+    protected final Set> sideEffects;
+
+    protected SideEffectRunnerHelper(final TransactionalGraphEngine dbEngine, final DBSerializer serializer,
+            final Set> sideEffects) {
+        this.dbEngine = dbEngine;
+        this.serializer = serializer;
+        this.sideEffects = sideEffects;
+    }
+
+    private void runSideEffects(Introspector obj) throws AAIException {
+        for (Class se : sideEffects) {
+            try {
+                se.getConstructor(Introspector.class, TransactionalGraphEngine.class, DBSerializer.class)
+                        .newInstance(obj, dbEngine, serializer).execute();
+            } catch (UnsupportedEncodingException | InstantiationException | IllegalAccessException
+                    | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException
+                    | URISyntaxException e) {
+                throw new AAIException("strange exception", e);
+            }
+        }
+    }
+
+    @Override
+    public void processPrimitive(String propName, Introspector obj) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void processPrimitiveList(String propName, Introspector obj) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void processComplexObj(Introspector obj) throws AAIException {
+
+        runSideEffects(obj);
+
+    }
+
+    @Override
+    public void modifyComplexList(List list, List listReference, Introspector parent,
+            Introspector child) {
+        // TODO Auto-generated method stub
+
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMissingRequiredPropertyException.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMissingRequiredPropertyException.java
index ac9abbe6..06f82404 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMissingRequiredPropertyException.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMissingRequiredPropertyException.java
@@ -17,28 +17,28 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class AAIMissingRequiredPropertyException extends AAIException {
 
+    private static final long serialVersionUID = -8907079650472014019L;
 
-	private static final long serialVersionUID = -8907079650472014019L;
+    public AAIMissingRequiredPropertyException() {
+    }
 
-	public AAIMissingRequiredPropertyException() {}
+    public AAIMissingRequiredPropertyException(String message) {
+        super("AAI_5107", message);
+    }
 
-	public AAIMissingRequiredPropertyException(String message) {
-		super("AAI_5107", message);
-	}
+    public AAIMissingRequiredPropertyException(Throwable cause) {
+        super("AAI_5107", cause);
+    }
 
-	public AAIMissingRequiredPropertyException(Throwable cause) {
-		super("AAI_5107",cause);
-	}
+    public AAIMissingRequiredPropertyException(String message, Throwable cause) {
+        super("AAI_5107", cause, message);
+    }
 
-	public AAIMissingRequiredPropertyException(String message, Throwable cause) {
-		super("AAI_5107", cause, message);
-	}
-	
-	
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMultiplePropertiesException.java b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMultiplePropertiesException.java
index dc4be817..369ee8fc 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMultiplePropertiesException.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/sideeffect/exceptions/AAIMultiplePropertiesException.java
@@ -17,27 +17,28 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.sideeffect.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class AAIMultiplePropertiesException extends AAIException {
 
-	private static final long serialVersionUID = 2098371383166008345L;
+    private static final long serialVersionUID = 2098371383166008345L;
+
+    public AAIMultiplePropertiesException() {
+    }
 
-	public AAIMultiplePropertiesException() {}
+    public AAIMultiplePropertiesException(String message) {
+        super("AAI_6136", message);
+    }
 
-	public AAIMultiplePropertiesException(String message) {
-		super("AAI_6136", message);
-	}
+    public AAIMultiplePropertiesException(Throwable cause) {
+        super("AAI_6136", cause);
+    }
 
-	public AAIMultiplePropertiesException(Throwable cause) {
-		super("AAI_6136",cause);
-	}
+    public AAIMultiplePropertiesException(String message, Throwable cause) {
+        super("AAI_6136", cause, message);
+    }
 
-	public AAIMultiplePropertiesException(String message, Throwable cause) {
-		super("AAI_6136", cause, message);
-	}
-	
-	
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/CreateUUID.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/CreateUUID.java
index 4652c8fa..725792a2 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/CreateUUID.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/CreateUUID.java
@@ -17,14 +17,15 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.introspection.tools;
 
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.schema.enums.PropertyMetadata;
+package org.onap.aai.introspection.tools;
 
 import java.util.Map;
 import java.util.UUID;
 
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.schema.enums.PropertyMetadata;
+
 /**
  * CreateUUID is an issue resolver that is responsible
  * for looking to check if the property that is missing has
@@ -46,30 +47,31 @@ import java.util.UUID;
  */
 public class CreateUUID implements IssueResolver {
 
-	/**
-	 * Resolves the issue by checking if the issue type is missing key prop
-	 * and if it is it will retrieve the introspector associated with the issue
-	 * then gets the metadata associated to that specific property
-	 * and if it contains the auto generate meta property and if it does
-	 * then it will fix it by setting that property value to generated uuid
-	 *
-	 * @param issue the issue with the details associated to the problem
-	 * @return true if the issue has been successfully resolved
-	 *          false otherwise
-	 */
-	@Override
-	public boolean resolveIssue(Issue issue) {
+    /**
+     * Resolves the issue by checking if the issue type is missing key prop
+     * and if it is it will retrieve the introspector associated with the issue
+     * then gets the metadata associated to that specific property
+     * and if it contains the auto generate meta property and if it does
+     * then it will fix it by setting that property value to generated uuid
+     *
+     * @param issue the issue with the details associated to the problem
+     * @return true if the issue has been successfully resolved
+     *         false otherwise
+     */
+    @Override
+    public boolean resolveIssue(Issue issue) {
+
+        Introspector obj = issue.getIntrospector();
+        if (issue.getType().equals(IssueType.MISSING_KEY_PROP)) {
+            Map metadata = obj.getPropertyMetadata(issue.getPropName());
+            if (metadata.containsKey(PropertyMetadata.AUTO_GENERATE_UUID)
+                    && metadata.get(PropertyMetadata.AUTO_GENERATE_UUID).equals("true")) {
+                obj.setValue(issue.getPropName(), UUID.randomUUID().toString());
+                return true;
+            }
+        }
 
-		Introspector obj = issue.getIntrospector();
-		if (issue.getType().equals(IssueType.MISSING_KEY_PROP)) {
-			Map metadata = obj.getPropertyMetadata(issue.getPropName());
-			if (metadata.containsKey(PropertyMetadata.AUTO_GENERATE_UUID) && metadata.get(PropertyMetadata.AUTO_GENERATE_UUID).equals("true")) {
-				obj.setValue(issue.getPropName(), UUID.randomUUID().toString());
-				return true;
-			}
-		}
-		
-		return false;
-	}
+        return false;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/DefaultFields.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/DefaultFields.java
index cb7b5037..f05069ea 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/DefaultFields.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/DefaultFields.java
@@ -17,31 +17,32 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
+import java.util.Map;
+
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.schema.enums.PropertyMetadata;
 
-import java.util.Map;
-
 public class DefaultFields implements IssueResolver {
 
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean resolveIssue(Issue issue) {
-
-		Introspector obj = issue.getIntrospector();
-		if (issue.getType().equals(IssueType.MISSING_REQUIRED_PROP)) {
-			Map metadata = obj.getPropertyMetadata(issue.getPropName());
-			if (metadata.containsKey(PropertyMetadata.DEFAULT_VALUE)) {
-				obj.setValue(issue.getPropName(), metadata.get(PropertyMetadata.DEFAULT_VALUE));
-				return true;
-			}
-		}
-		
-		return false;
-	}
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean resolveIssue(Issue issue) {
+
+        Introspector obj = issue.getIntrospector();
+        if (issue.getType().equals(IssueType.MISSING_REQUIRED_PROP)) {
+            Map metadata = obj.getPropertyMetadata(issue.getPropName());
+            if (metadata.containsKey(PropertyMetadata.DEFAULT_VALUE)) {
+                obj.setValue(issue.getPropName(), metadata.get(PropertyMetadata.DEFAULT_VALUE));
+                return true;
+            }
+        }
+
+        return false;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/InjectKeysFromURI.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/InjectKeysFromURI.java
index 7f6bb39f..748821a7 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/InjectKeysFromURI.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/InjectKeysFromURI.java
@@ -17,52 +17,53 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
+import java.net.URI;
+
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.parsers.uri.URIToObject;
 
-import java.net.URI;
+public class InjectKeysFromURI implements IssueResolver {
+
+    private URI uri = null;
+    private Loader loader = null;
+
+    /**
+     * Instantiates a new inject keys from URI.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     */
+    public InjectKeysFromURI(Loader loader, URI uri) {
+        this.loader = loader;
+        this.uri = uri;
+    }
 
-public class InjectKeysFromURI  implements IssueResolver {
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean resolveIssue(Issue issue) {
+        boolean result = false;
+        Introspector obj = issue.getIntrospector();
+        if (issue.getType().equals(IssueType.MISSING_KEY_PROP)) {
+            try {
+                URIToObject toObject = new URIToObject(loader, uri);
+                Introspector minimumObj = toObject.getEntity();
+                if (toObject.getEntityName().equals(obj.getDbName())) {
+                    obj.setValue(issue.getPropName(), minimumObj.getValue(issue.getPropName()));
+                    result = true;
+                }
+            } catch (Exception e) {
+                // log something probably
+                result = false;
+            }
+        }
 
-	private URI uri = null;
-	private Loader loader = null;
-	
-	/**
-	 * Instantiates a new inject keys from URI.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 */
-	public InjectKeysFromURI(Loader loader, URI uri) {
-		this.loader = loader;
-		this.uri = uri;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean resolveIssue(Issue issue) {
-		boolean result = false;
-		Introspector obj = issue.getIntrospector();
-		if (issue.getType().equals(IssueType.MISSING_KEY_PROP)) {
-			try {
-				URIToObject toObject = new URIToObject(loader, uri);
-				Introspector minimumObj = toObject.getEntity();
-				if (toObject.getEntityName().equals(obj.getDbName())) {
-					obj.setValue(issue.getPropName(), minimumObj.getValue(issue.getPropName()));
-					result = true;
-				}
-			} catch (Exception e) {
-				//log something probably
-				result = false;
-			}
-		}
-		
-		return result;
-	}
+        return result;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/IntrospectorValidator.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/IntrospectorValidator.java
index c6d31c27..8e1d8eeb 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/IntrospectorValidator.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/IntrospectorValidator.java
@@ -17,8 +17,11 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
+import java.util.*;
+
 import org.onap.aai.db.props.AAIProperties;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
@@ -27,291 +30,291 @@ import org.onap.aai.introspection.Visibility;
 import org.onap.aai.introspection.Wanderer;
 import org.onap.aai.schema.enums.PropertyMetadata;
 
-import java.util.*;
-
 public class IntrospectorValidator implements Wanderer {
 
-	
-	private List issues = null;
-	private List issueResolvers = null; 
-	private boolean validateRequired = true;
-	private final int maximumDepth;
-	private int currentDepth = 0;
-	
-	private final Set relationshipChain;
-	/**
-	 * Instantiates a new introspector validator.
-	 *
-	 * @param builder the builder
-	 */
-	private IntrospectorValidator(Builder builder) {
-		this.validateRequired = builder.getValidateRequired();
-		this.issueResolvers = builder.getResolvers();
-		this.maximumDepth = builder.getMaximumDepth();
-		issues = new ArrayList<>();
-		
-		relationshipChain = new HashSet<>();
-		
-		relationshipChain.add("relationship-list");
-		relationshipChain.add("relationship");
-		relationshipChain.add("relationship-data");
-		relationshipChain.add("related-to-property");
-
-
-	}
-	
-	/**
-	 * Validate.
-	 *
-	 * @param obj the obj
-	 * @return true, if successful
-	 * @throws AAIException 
-	 */
-	public boolean validate(Introspector obj) throws AAIException {
-		IntrospectorWalker walker = new IntrospectorWalker(this);
-		this.currentDepth = 0;
-		walker.walk(obj);
-		
-		for (Issue m : issues) {
-			if (!m.getSeverity().equals(Severity.WARNING)) {
-				return false;
-			}
-		}
-		
-		return true;
-	}
-	
-	/**
-	 * Gets the issues.
-	 *
-	 * @return the issues
-	 */
-	public List getIssues() {
-		return this.issues;
-	}
-	
-	/**
-	 * Sets the issue resolvers.
-	 *
-	 * @param resolvers the new issue resolvers
-	 */
-	public void setIssueResolvers(List resolvers) {
-		issueResolvers = new ArrayList<>();
-		for (IssueResolver resolver : resolvers) {
-			issueResolvers.add(resolver);
-		}
-	}
-	
-	/**
-	 * Resolve issues.
-	 *
-	 * @return true, if successful
-	 */
-	public boolean resolveIssues() {
-		boolean result = true;
-		for (Issue issue : issues) {
-			for (IssueResolver resolver : issueResolvers) {
-				if (resolver.resolveIssue(issue)) {
-					issue.setResolved(true);
-				}
-			}
-			if (!issue.isResolved()) {
-				result = false;
-			}
-		}
-		
-		return result;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void processComplexObj(Introspector obj) {
-				
-		if (this.currentDepth > this.maximumDepth && !relationshipChain.contains(obj.getDbName())) {
-			Issue message = 
-					this.buildMessage(Severity.CRITICAL, IssueType.EXCEEDED_ALLOWED_DEPTH, "Maximum allowed depth of this object has been exceeded on: " + obj.getDbName());
-			message.setIntrospector(obj);
-			issues.add(message);
-		}
-		Set requiredProps = obj.getRequiredProperties();
-		Set keys = obj.getKeys();
-		Set props = obj.getProperties();
-		
-		for (String prop : props) {
-			Object value = obj.getValue(prop);
-			if (keys.contains(prop)) {
-				if (value == null) {
-					Issue message = 
-							this.buildMessage(Severity.CRITICAL, IssueType.MISSING_KEY_PROP, "Missing key property: " + prop);
-					message.setIntrospector(obj);
-					message.setPropName(prop);
-					issues.add(message);
-				}
-			} else if (requiredProps.contains(prop)) {
-				if (value == null && validateRequired) {
-					Issue message = 
-							this.buildMessage(Severity.CRITICAL, IssueType.MISSING_REQUIRED_PROP, "Missing required property: " + prop);
-					message.setIntrospector(obj);
-					message.setPropName(prop);
-					issues.add(message);
-				}
-			}
-			
-			final Optional visibility = obj.getPropertyMetadata(prop, PropertyMetadata.VISIBILITY);
-			if(visibility.isPresent() && Visibility.internal.equals(Visibility.valueOf(visibility.get())) && obj.getValue(prop) != null) {
-				Issue message =
-						this.buildMessage(Severity.ERROR, IssueType.PROPERTY_NOT_VISIBLE, "client attemptted to set property not visible: " + prop);
-				message.setIntrospector(obj);
-				message.setPropName(prop);
-				issues.add(message);
-				
-			}
-			final Optional requires = obj.getPropertyMetadata(prop, PropertyMetadata.REQUIRES);
-			if (requires.isPresent() && (obj.getValue(prop) != null && obj.getValue(requires.get()) == null)) {
-				Issue message =
-						this.buildMessage(Severity.CRITICAL, IssueType.DEPENDENT_PROP_NOT_FOUND, prop + " requires " + requires.get() + " to also be popluated.");
-				message.setIntrospector(obj);
-				message.setPropName(prop);
-				issues.add(message);
-			}
-		}
-		
-		if (!relationshipChain.contains(obj.getDbName())) {
-			this.currentDepth++;
-		}
-
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void processPrimitive(String propName, Introspector obj) {
-		//NO OP
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void processPrimitiveList(String propName, Introspector obj) {
-		//NO OP
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void modifyComplexList(List list, List listReference, Introspector parent, Introspector child) {
-		//NO OP
-	}
-	
-	
-	/**
-	 * Builds the message.
-	 *
-	 * @param severity the severity
-	 * @param error the error
-	 * @param detail the detail
-	 * @return the issue
-	 */
-	private Issue buildMessage(Severity severity, IssueType error, String detail) {
-		Issue message = new Issue();
-		message.setSeverity(severity);
-		message.setType(error);
-		message.setDetail(detail);
-		
-		return message;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean createComplexObjIfNull() {
-		return false;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int createComplexListSize(Introspector parent, Introspector child) {
-		return 0;
-	}
-	
-	public static class Builder {
-		
-		private boolean validateRequired = true;
-		private List issueResolvers = null;
-		private int maximumDepth = AAIProperties.MAXIMUM_DEPTH;
-		/**
-		 * Instantiates a new builder.
-		 *
-		 * @param llBuilder the ll builder
-		 */
-		public Builder() {
-			issueResolvers = new ArrayList();
-		}
-		
-		/**
-		 * Validate required.
-		 *
-		 * @param validateRequired the validate required
-		 * @return the builder
-		 */
-		public Builder validateRequired(boolean validateRequired) {
-			this.validateRequired = validateRequired;
-			return this;
-		}
-		
-		public Builder restrictDepth(int depth) {
-			this.maximumDepth = depth; 
-			return this;
-		}
-		/**
-		 * Adds the resolver.
-		 *
-		 * @param resolver the resolver
-		 * @return the builder
-		 */
-		public Builder addResolver(IssueResolver resolver) {
-			issueResolvers.add(resolver);
-			return this;
-		}
-		
-		/**
-		 * Builds the.
-		 *
-		 * @return the introspector validator
-		 */
-		public IntrospectorValidator build() {
-			return new IntrospectorValidator(this);
-		}
-		
-		/**
-		 * Gets the validate required.
-		 *
-		 * @return the validate required
-		 */
-		public boolean getValidateRequired() {
-			return this.validateRequired;
-		}
-		
-		/**
-		 * Gets the resolvers.
-		 *
-		 * @return the resolvers
-		 */
-		public List getResolvers() {
-			return this.issueResolvers;
-		}
-		
-		public int getMaximumDepth() {
-			return this.maximumDepth;
-		}
-	}
-	
+    private List issues = null;
+    private List issueResolvers = null;
+    private boolean validateRequired = true;
+    private final int maximumDepth;
+    private int currentDepth = 0;
+
+    private final Set relationshipChain;
+
+    /**
+     * Instantiates a new introspector validator.
+     *
+     * @param builder the builder
+     */
+    private IntrospectorValidator(Builder builder) {
+        this.validateRequired = builder.getValidateRequired();
+        this.issueResolvers = builder.getResolvers();
+        this.maximumDepth = builder.getMaximumDepth();
+        issues = new ArrayList<>();
+
+        relationshipChain = new HashSet<>();
+
+        relationshipChain.add("relationship-list");
+        relationshipChain.add("relationship");
+        relationshipChain.add("relationship-data");
+        relationshipChain.add("related-to-property");
+
+    }
+
+    /**
+     * Validate.
+     *
+     * @param obj the obj
+     * @return true, if successful
+     * @throws AAIException
+     */
+    public boolean validate(Introspector obj) throws AAIException {
+        IntrospectorWalker walker = new IntrospectorWalker(this);
+        this.currentDepth = 0;
+        walker.walk(obj);
+
+        for (Issue m : issues) {
+            if (!m.getSeverity().equals(Severity.WARNING)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets the issues.
+     *
+     * @return the issues
+     */
+    public List getIssues() {
+        return this.issues;
+    }
+
+    /**
+     * Sets the issue resolvers.
+     *
+     * @param resolvers the new issue resolvers
+     */
+    public void setIssueResolvers(List resolvers) {
+        issueResolvers = new ArrayList<>();
+        for (IssueResolver resolver : resolvers) {
+            issueResolvers.add(resolver);
+        }
+    }
+
+    /**
+     * Resolve issues.
+     *
+     * @return true, if successful
+     */
+    public boolean resolveIssues() {
+        boolean result = true;
+        for (Issue issue : issues) {
+            for (IssueResolver resolver : issueResolvers) {
+                if (resolver.resolveIssue(issue)) {
+                    issue.setResolved(true);
+                }
+            }
+            if (!issue.isResolved()) {
+                result = false;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void processComplexObj(Introspector obj) {
+
+        if (this.currentDepth > this.maximumDepth && !relationshipChain.contains(obj.getDbName())) {
+            Issue message = this.buildMessage(Severity.CRITICAL, IssueType.EXCEEDED_ALLOWED_DEPTH,
+                    "Maximum allowed depth of this object has been exceeded on: " + obj.getDbName());
+            message.setIntrospector(obj);
+            issues.add(message);
+        }
+        Set requiredProps = obj.getRequiredProperties();
+        Set keys = obj.getKeys();
+        Set props = obj.getProperties();
+
+        for (String prop : props) {
+            Object value = obj.getValue(prop);
+            if (keys.contains(prop)) {
+                if (value == null) {
+                    Issue message = this.buildMessage(Severity.CRITICAL, IssueType.MISSING_KEY_PROP,
+                            "Missing key property: " + prop);
+                    message.setIntrospector(obj);
+                    message.setPropName(prop);
+                    issues.add(message);
+                }
+            } else if (requiredProps.contains(prop)) {
+                if (value == null && validateRequired) {
+                    Issue message = this.buildMessage(Severity.CRITICAL, IssueType.MISSING_REQUIRED_PROP,
+                            "Missing required property: " + prop);
+                    message.setIntrospector(obj);
+                    message.setPropName(prop);
+                    issues.add(message);
+                }
+            }
+
+            final Optional visibility = obj.getPropertyMetadata(prop, PropertyMetadata.VISIBILITY);
+            if (visibility.isPresent() && Visibility.internal.equals(Visibility.valueOf(visibility.get()))
+                    && obj.getValue(prop) != null) {
+                Issue message = this.buildMessage(Severity.ERROR, IssueType.PROPERTY_NOT_VISIBLE,
+                        "client attemptted to set property not visible: " + prop);
+                message.setIntrospector(obj);
+                message.setPropName(prop);
+                issues.add(message);
+
+            }
+            final Optional requires = obj.getPropertyMetadata(prop, PropertyMetadata.REQUIRES);
+            if (requires.isPresent() && (obj.getValue(prop) != null && obj.getValue(requires.get()) == null)) {
+                Issue message = this.buildMessage(Severity.CRITICAL, IssueType.DEPENDENT_PROP_NOT_FOUND,
+                        prop + " requires " + requires.get() + " to also be popluated.");
+                message.setIntrospector(obj);
+                message.setPropName(prop);
+                issues.add(message);
+            }
+        }
+
+        if (!relationshipChain.contains(obj.getDbName())) {
+            this.currentDepth++;
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void processPrimitive(String propName, Introspector obj) {
+        // NO OP
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void processPrimitiveList(String propName, Introspector obj) {
+        // NO OP
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void modifyComplexList(List list, List listReference, Introspector parent,
+            Introspector child) {
+        // NO OP
+    }
+
+    /**
+     * Builds the message.
+     *
+     * @param severity the severity
+     * @param error the error
+     * @param detail the detail
+     * @return the issue
+     */
+    private Issue buildMessage(Severity severity, IssueType error, String detail) {
+        Issue message = new Issue();
+        message.setSeverity(severity);
+        message.setType(error);
+        message.setDetail(detail);
+
+        return message;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean createComplexObjIfNull() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int createComplexListSize(Introspector parent, Introspector child) {
+        return 0;
+    }
+
+    public static class Builder {
+
+        private boolean validateRequired = true;
+        private List issueResolvers = null;
+        private int maximumDepth = AAIProperties.MAXIMUM_DEPTH;
+
+        /**
+         * Instantiates a new builder.
+         *
+         * @param llBuilder the ll builder
+         */
+        public Builder() {
+            issueResolvers = new ArrayList();
+        }
+
+        /**
+         * Validate required.
+         *
+         * @param validateRequired the validate required
+         * @return the builder
+         */
+        public Builder validateRequired(boolean validateRequired) {
+            this.validateRequired = validateRequired;
+            return this;
+        }
+
+        public Builder restrictDepth(int depth) {
+            this.maximumDepth = depth;
+            return this;
+        }
+
+        /**
+         * Adds the resolver.
+         *
+         * @param resolver the resolver
+         * @return the builder
+         */
+        public Builder addResolver(IssueResolver resolver) {
+            issueResolvers.add(resolver);
+            return this;
+        }
+
+        /**
+         * Builds the.
+         *
+         * @return the introspector validator
+         */
+        public IntrospectorValidator build() {
+            return new IntrospectorValidator(this);
+        }
+
+        /**
+         * Gets the validate required.
+         *
+         * @return the validate required
+         */
+        public boolean getValidateRequired() {
+            return this.validateRequired;
+        }
+
+        /**
+         * Gets the resolvers.
+         *
+         * @return the resolvers
+         */
+        public List getResolvers() {
+            return this.issueResolvers;
+        }
+
+        public int getMaximumDepth() {
+            return this.maximumDepth;
+        }
+    }
+
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/Issue.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/Issue.java
index 73ab232e..c4e6850e 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/Issue.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/Issue.java
@@ -17,127 +17,127 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
 import org.onap.aai.introspection.Introspector;
 
 public class Issue {
 
-	private Severity severity;
-	private IssueType error;
-	private String detail;
-	private Introspector obj;
-	private String propName;
-	private boolean resolved = false;
-	
-	/**
-	 * Sets the severity.
-	 *
-	 * @param severity the new severity
-	 */
-	public void setSeverity(Severity severity) {
-
-		this.severity = severity;
-	}
-
-	/**
-	 * Sets the error.
-	 *
-	 * @param error the new error
-	 */
-	public void setType(IssueType error) {
-		this.error = error;
-	}
-
-	/**
-	 * Sets the detail.
-	 *
-	 * @param detail the new detail
-	 */
-	public void setDetail(String detail) {
-		this.detail = detail;
-	}
-
-	/**
-	 * Gets the severity.
-	 *
-	 * @return the severity
-	 */
-	public Object getSeverity() {
-		return this.severity;
-	}
-	
-	/**
-	 * Sets the introspector.
-	 *
-	 * @param obj the new introspector
-	 */
-	public void setIntrospector(Introspector obj) {
-		this.obj = obj;
-	}
-	
-	/**
-	 * Gets the introspector.
-	 *
-	 * @return the introspector
-	 */
-	public Introspector getIntrospector() {
-		return this.obj;
-	}
-
-	/**
-	 * Gets the detail.
-	 *
-	 * @return the detail
-	 */
-	public String getDetail() {
-		return this.detail;
-	}
-	
-	/**
-	 * Gets the error.
-	 *
-	 * @return the error
-	 */
-	public IssueType getType() {
-		return this.error;
-	}
-
-	/**
-	 * Sets the prop name.
-	 *
-	 * @param prop the new prop name
-	 */
-	public void setPropName(String prop) {
-		this.propName= prop;
-	}
-	
-	/**
-	 * Gets the prop name.
-	 *
-	 * @return the prop name
-	 */
-	public String getPropName() {
-		return this.propName;
-	}
-
-	/**
-	 * Checks if is resolved.
-	 *
-	 * @return true, if is resolved
-	 */
-	public boolean isResolved() {
-		return resolved;
-	}
-
-	/**
-	 * Sets the resolved.
-	 *
-	 * @param resolved the new resolved
-	 */
-	public void setResolved(boolean resolved) {
-		this.resolved = resolved;
-	}
-	
-	
+    private Severity severity;
+    private IssueType error;
+    private String detail;
+    private Introspector obj;
+    private String propName;
+    private boolean resolved = false;
+
+    /**
+     * Sets the severity.
+     *
+     * @param severity the new severity
+     */
+    public void setSeverity(Severity severity) {
+
+        this.severity = severity;
+    }
+
+    /**
+     * Sets the error.
+     *
+     * @param error the new error
+     */
+    public void setType(IssueType error) {
+        this.error = error;
+    }
+
+    /**
+     * Sets the detail.
+     *
+     * @param detail the new detail
+     */
+    public void setDetail(String detail) {
+        this.detail = detail;
+    }
+
+    /**
+     * Gets the severity.
+     *
+     * @return the severity
+     */
+    public Object getSeverity() {
+        return this.severity;
+    }
+
+    /**
+     * Sets the introspector.
+     *
+     * @param obj the new introspector
+     */
+    public void setIntrospector(Introspector obj) {
+        this.obj = obj;
+    }
+
+    /**
+     * Gets the introspector.
+     *
+     * @return the introspector
+     */
+    public Introspector getIntrospector() {
+        return this.obj;
+    }
+
+    /**
+     * Gets the detail.
+     *
+     * @return the detail
+     */
+    public String getDetail() {
+        return this.detail;
+    }
+
+    /**
+     * Gets the error.
+     *
+     * @return the error
+     */
+    public IssueType getType() {
+        return this.error;
+    }
+
+    /**
+     * Sets the prop name.
+     *
+     * @param prop the new prop name
+     */
+    public void setPropName(String prop) {
+        this.propName = prop;
+    }
+
+    /**
+     * Gets the prop name.
+     *
+     * @return the prop name
+     */
+    public String getPropName() {
+        return this.propName;
+    }
+
+    /**
+     * Checks if is resolved.
+     *
+     * @return true, if is resolved
+     */
+    public boolean isResolved() {
+        return resolved;
+    }
+
+    /**
+     * Sets the resolved.
+     *
+     * @param resolved the new resolved
+     */
+    public void setResolved(boolean resolved) {
+        this.resolved = resolved;
+    }
+
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueResolver.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueResolver.java
index b47d7531..63f7e8ec 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueResolver.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueResolver.java
@@ -17,16 +17,16 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
 public interface IssueResolver {
 
-	
-	/**
-	 * Resolve issue.
-	 *
-	 * @param issue the issue
-	 * @return true, if successful
-	 */
-	public boolean resolveIssue(Issue issue);
+    /**
+     * Resolve issue.
+     *
+     * @param issue the issue
+     * @return true, if successful
+     */
+    public boolean resolveIssue(Issue issue);
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueType.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueType.java
index 51516172..8b75bf8f 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueType.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/IssueType.java
@@ -17,8 +17,9 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
 public enum IssueType {
-	MISSING_REQUIRED_PROP, MISSING_KEY_PROP, EXCEEDED_ALLOWED_DEPTH, PROPERTY_NOT_VISIBLE, DEPENDENT_PROP_NOT_FOUND
+    MISSING_REQUIRED_PROP, MISSING_KEY_PROP, EXCEEDED_ALLOWED_DEPTH, PROPERTY_NOT_VISIBLE, DEPENDENT_PROP_NOT_FOUND
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/RemoveNonVisibleProperty.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/RemoveNonVisibleProperty.java
index 07fff1bc..062fb96b 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/RemoveNonVisibleProperty.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/RemoveNonVisibleProperty.java
@@ -17,19 +17,20 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
 public class RemoveNonVisibleProperty implements IssueResolver {
 
-	@Override
-	public boolean resolveIssue(Issue issue) {
+    @Override
+    public boolean resolveIssue(Issue issue) {
 
-		if (IssueType.PROPERTY_NOT_VISIBLE.equals(issue.getType())) {
-			//remove property value
-			issue.getIntrospector().setValue(issue.getPropName(), null);
-			return true;
-		}
-		return false;
-	}
+        if (IssueType.PROPERTY_NOT_VISIBLE.equals(issue.getType())) {
+            // remove property value
+            issue.getIntrospector().setValue(issue.getPropName(), null);
+            return true;
+        }
+        return false;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/introspection/tools/Severity.java b/aai-core/src/main/java/org/onap/aai/introspection/tools/Severity.java
index 5e48bcc1..5cc56cc7 100644
--- a/aai-core/src/main/java/org/onap/aai/introspection/tools/Severity.java
+++ b/aai-core/src/main/java/org/onap/aai/introspection/tools/Severity.java
@@ -17,10 +17,9 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.introspection.tools;
 
 public enum Severity {
-	WARNING,
-	ERROR,
-	CRITICAL
+    WARNING, ERROR, CRITICAL
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/CNName.java b/aai-core/src/main/java/org/onap/aai/logging/CNName.java
index 1a60af13..5337afe3 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/CNName.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/CNName.java
@@ -17,80 +17,83 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
+import static java.util.Base64.getDecoder;
+
 import ch.qos.logback.access.pattern.AccessConverter;
 import ch.qos.logback.access.spi.IAccessEvent;
+
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
-import javax.security.auth.x500.X500Principal;
-import javax.servlet.http.HttpServletRequest;
 import java.security.cert.X509Certificate;
 
-import static java.util.Base64.getDecoder;
+import javax.security.auth.x500.X500Principal;
+import javax.servlet.http.HttpServletRequest;
 
 public class CNName extends AccessConverter {
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(CNName.class);
-
-	/**
-	 * Converts access events to String response codes
-	 * 
-	 * @param accessEvent the IAccessEvent
-	 */
-	public String convert(IAccessEvent accessEvent) {
-		if (!isStarted()) {
-			return "INACTIVE_HEADER_CONV";
-		}
-
-		String cipherSuite = (String) accessEvent.getRequest().getAttribute("javax.servlet.request.cipher_suite");
-		String authUser = null;
-		if (cipherSuite != null) {
-			try {
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(CNName.class);
+
+    /**
+     * Converts access events to String response codes
+     * 
+     * @param accessEvent the IAccessEvent
+     */
+    public String convert(IAccessEvent accessEvent) {
+        if (!isStarted()) {
+            return "INACTIVE_HEADER_CONV";
+        }
+
+        String cipherSuite = (String) accessEvent.getRequest().getAttribute("javax.servlet.request.cipher_suite");
+        String authUser = null;
+        if (cipherSuite != null) {
+            try {
                 X509Certificate certChain[] = (X509Certificate[]) accessEvent.getRequest()
                         .getAttribute("javax.servlet.request.X509Certificate");
-				if(certChain == null || certChain.length == 0){
+                if (certChain == null || certChain.length == 0) {
 
-					HttpServletRequest request = accessEvent.getRequest();
+                    HttpServletRequest request = accessEvent.getRequest();
 
-					String authorization = request.getHeader("Authorization");
+                    String authorization = request.getHeader("Authorization");
 
                     // Set the auth user to "-" so if the authorization header is not found
-					// Or if the decoded basic auth credentials are not found in the format required
-					// it should return "-"
-					// If the decoded string is in the right format, find the index of ":"
+                    // Or if the decoded basic auth credentials are not found in the format required
+                    // it should return "-"
+                    // If the decoded string is in the right format, find the index of ":"
                     // Then get the substring of the starting point to the colon not including the colon
 
                     authUser = "-";
 
-					if(authorization != null && authorization.startsWith("Basic ")){
-						String credentials = authorization.replace("Basic ", "");
+                    if (authorization != null && authorization.startsWith("Basic ")) {
+                        String credentials = authorization.replace("Basic ", "");
                         byte[] userCredentials = getDecoder().decode(credentials.getBytes("utf-8"));
                         credentials = new String(userCredentials);
 
-						int codePoint = credentials.indexOf(':');
+                        int codePoint = credentials.indexOf(':');
 
-						if(codePoint != -1){
+                        if (codePoint != -1) {
                             authUser = credentials.substring(0, codePoint);
-						}
-
-					}
-
-					return authUser;
-
-				} else {
-					X509Certificate clientCert = certChain[0];
-					X500Principal subjectDN = clientCert.getSubjectX500Principal();
-					authUser = subjectDN.toString();
-					return authUser;
-				}
-			} catch(Exception e){
-                LOGGER.error(e.getMessage(),e);
-				return "-";
-			}
-		} else {
-			return "-";
-		}
-	}
+                        }
+
+                    }
+
+                    return authUser;
+
+                } else {
+                    X509Certificate clientCert = certChain[0];
+                    X500Principal subjectDN = clientCert.getSubjectX500Principal();
+                    authUser = subjectDN.toString();
+                    return authUser;
+                }
+            } catch (Exception e) {
+                LOGGER.error(e.getMessage(), e);
+                return "-";
+            }
+        } else {
+            return "-";
+        }
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayout.java b/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayout.java
index ee7b4ef9..63cc49f7 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayout.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayout.java
@@ -17,11 +17,12 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 public class CustomLogPatternLayout extends ch.qos.logback.access.PatternLayout {
-	static {
-		defaultConverterMap.put("z", CNName.class.getName());
-		defaultConverterMap.put("y", DME2RestFlag.class.getName());
-	}
+    static {
+        defaultConverterMap.put("z", CNName.class.getName());
+        defaultConverterMap.put("y", DME2RestFlag.class.getName());
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayoutEncoder.java b/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayoutEncoder.java
index 0f474eef..010d828b 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayoutEncoder.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/CustomLogPatternLayoutEncoder.java
@@ -17,23 +17,24 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import ch.qos.logback.access.PatternLayout;
 
 public class CustomLogPatternLayoutEncoder extends ch.qos.logback.access.PatternLayoutEncoder {
 
-/**
- * @{inheritDoc}
- */
-	@Override
-	public void start(){
-		PatternLayout patternLayout = new CustomLogPatternLayout();
-		patternLayout.setContext(context);
-		patternLayout.setPattern(getPattern());
-		patternLayout.start();
-		this.layout = patternLayout;
-		super.start();
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void start() {
+        PatternLayout patternLayout = new CustomLogPatternLayout();
+        patternLayout.setContext(context);
+        patternLayout.setPattern(getPattern());
+        patternLayout.start();
+        this.layout = patternLayout;
+        super.start();
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/DME2RestFlag.java b/aai-core/src/main/java/org/onap/aai/logging/DME2RestFlag.java
index 86c25260..768c095b 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/DME2RestFlag.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/DME2RestFlag.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import ch.qos.logback.access.pattern.AccessConverter;
@@ -24,31 +25,31 @@ import ch.qos.logback.access.spi.IAccessEvent;
 
 public class DME2RestFlag extends AccessConverter {
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String convert(IAccessEvent accessEvent) {
-		if (!isStarted()) {
-			return "INACTIVE_HEADER_CONV";
-		}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String convert(IAccessEvent accessEvent) {
+        if (!isStarted()) {
+            return "INACTIVE_HEADER_CONV";
+        }
 
-		String flag = "-";
+        String flag = "-";
 
-		if (accessEvent.getRequestParameter("envContext").length > 0
-				&& !accessEvent.getRequestParameter("envContext")[0].isEmpty()
-				&& !accessEvent.getRequestParameter("envContext")[0].equals("-")
-				&& accessEvent.getRequestParameter("routeOffer").length > 0
-				&& !accessEvent.getRequestParameter("routeOffer")[0].isEmpty()
-				&& !accessEvent.getRequestParameter("routeOffer")[0].equals("-")
-				&& accessEvent.getRequestParameter("version").length > 0
-				&& !accessEvent.getRequestParameter("version")[0].isEmpty()
-				&& !accessEvent.getRequestParameter("version")[0].equals("-")) {
-			flag = "DME2";
-		} else {
-			flag = "REST";
-		}
+        if (accessEvent.getRequestParameter("envContext").length > 0
+                && !accessEvent.getRequestParameter("envContext")[0].isEmpty()
+                && !accessEvent.getRequestParameter("envContext")[0].equals("-")
+                && accessEvent.getRequestParameter("routeOffer").length > 0
+                && !accessEvent.getRequestParameter("routeOffer")[0].isEmpty()
+                && !accessEvent.getRequestParameter("routeOffer")[0].equals("-")
+                && accessEvent.getRequestParameter("version").length > 0
+                && !accessEvent.getRequestParameter("version")[0].isEmpty()
+                && !accessEvent.getRequestParameter("version")[0].equals("-")) {
+            flag = "DME2";
+        } else {
+            flag = "REST";
+        }
 
-		return flag;
-	}
+        return flag;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompElapsedTime.java b/aai-core/src/main/java/org/onap/aai/logging/EcompElapsedTime.java
index f6c89b9f..66d27868 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompElapsedTime.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompElapsedTime.java
@@ -17,50 +17,50 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.logging;
 
-import org.onap.aai.logging.LoggingContext.LoggingField;
+package org.onap.aai.logging;
 
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
+import org.onap.aai.logging.LoggingContext.LoggingField;
+
 public class EcompElapsedTime extends ClassicConverter {
 
-	private static final String DEFAULT_ELAPSED_TIME_FORMAT = "%d";
+    private static final String DEFAULT_ELAPSED_TIME_FORMAT = "%d";
 
-	private String ELAPSED_TIME_FORMAT;
+    private String ELAPSED_TIME_FORMAT;
 
-	@Override
-	public void start() {
-		ELAPSED_TIME_FORMAT = getFirstOption();
-	}
+    @Override
+    public void start() {
+        ELAPSED_TIME_FORMAT = getFirstOption();
+    }
 
-	@Override
-	public String convert(ILoggingEvent event) {
-		final long end = event.getTimeStamp();
+    @Override
+    public String convert(ILoggingEvent event) {
+        final long end = event.getTimeStamp();
 
-		if (!event.getMDCPropertyMap().containsKey(LoggingField.START_TIME.toString())) {
-			return format(0);
-		} else if (event.getMDCPropertyMap().containsKey(LoggingField.ELAPSED_TIME.toString())) {
-			return format(
-						Integer.parseInt(event.getMDCPropertyMap().get(LoggingField.ELAPSED_TIME.toString()))
-					);
-		}
+        if (!event.getMDCPropertyMap().containsKey(LoggingField.START_TIME.toString())) {
+            return format(0);
+        } else if (event.getMDCPropertyMap().containsKey(LoggingField.ELAPSED_TIME.toString())) {
+            return format(Integer.parseInt(event.getMDCPropertyMap().get(LoggingField.ELAPSED_TIME.toString())));
+        }
 
-		final long start = LogFormatTools.toTimestamp(event.getMDCPropertyMap().get(LoggingField.START_TIME.toString()));
+        final long start =
+                LogFormatTools.toTimestamp(event.getMDCPropertyMap().get(LoggingField.START_TIME.toString()));
 
-		return format(end - start);
-	}
+        return format(end - start);
+    }
 
-	private String format(long elapsedTime) {
-		if (ELAPSED_TIME_FORMAT == null) {
-			return format(DEFAULT_ELAPSED_TIME_FORMAT, elapsedTime);
-		}
+    private String format(long elapsedTime) {
+        if (ELAPSED_TIME_FORMAT == null) {
+            return format(DEFAULT_ELAPSED_TIME_FORMAT, elapsedTime);
+        }
 
-		return format (ELAPSED_TIME_FORMAT, elapsedTime);
-	}
+        return format(ELAPSED_TIME_FORMAT, elapsedTime);
+    }
 
-	private String format(String format, long elapsedTime) {
-		return String.format(format, elapsedTime);
-	}
+    private String format(String format, long elapsedTime) {
+        return String.format(format, elapsedTime);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompEncoder.java b/aai-core/src/main/java/org/onap/aai/logging/EcompEncoder.java
index 18a8425f..88587297 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompEncoder.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompEncoder.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import ch.qos.logback.classic.PatternLayout;
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompErrorCategory.java b/aai-core/src/main/java/org/onap/aai/logging/EcompErrorCategory.java
index 48c87c59..452fcd08 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompErrorCategory.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompErrorCategory.java
@@ -17,26 +17,26 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
+import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.Level;
 
 public class EcompErrorCategory extends ClassicConverter {
 
-	@Override
-	public String convert(ILoggingEvent event) {
-		
-		final Level lev = event.getLevel();
-		final String defaultCategory = "WARN";
-		
-		if ((Level.WARN).equals(lev)) {
-			return (defaultCategory);
-		}
-		else if ((Level.ERROR).equals(lev)) {
-			return ("ERROR");
-		}
-		return (defaultCategory);
-	}
+    @Override
+    public String convert(ILoggingEvent event) {
+
+        final Level lev = event.getLevel();
+        final String defaultCategory = "WARN";
+
+        if ((Level.WARN).equals(lev)) {
+            return (defaultCategory);
+        } else if ((Level.ERROR).equals(lev)) {
+            return ("ERROR");
+        }
+        return (defaultCategory);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompPatternLayout.java b/aai-core/src/main/java/org/onap/aai/logging/EcompPatternLayout.java
index 65374312..43c147a0 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompPatternLayout.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompPatternLayout.java
@@ -17,19 +17,20 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import ch.qos.logback.classic.PatternLayout;
 
 public class EcompPatternLayout extends PatternLayout {
-	static {
-		PatternLayout.defaultConverterMap.put("ecompStartTime", EcompStartTime.class.getName());
-		PatternLayout.defaultConverterMap.put("ecompElapsedTime", EcompElapsedTime.class.getName());
-		PatternLayout.defaultConverterMap.put("eelfClassOfCaller", EelfClassOfCaller.class.getName());
-		PatternLayout.defaultConverterMap.put("ecompErrorCategory", EcompErrorCategory.class.getName());
-		PatternLayout.defaultConverterMap.put("ecompResponseCode", EcompResponseCode.class.getName());
-		PatternLayout.defaultConverterMap.put("ecompResponseDescription", EcompResponseDescription.class.getName());
-		PatternLayout.defaultConverterMap.put("ecompStatusCode", EcompStatusCode.class.getName());
-		PatternLayout.defaultConverterMap.put("ecompServiceName", EcompServiceName.class.getName());
-	}
+    static {
+        PatternLayout.defaultConverterMap.put("ecompStartTime", EcompStartTime.class.getName());
+        PatternLayout.defaultConverterMap.put("ecompElapsedTime", EcompElapsedTime.class.getName());
+        PatternLayout.defaultConverterMap.put("eelfClassOfCaller", EelfClassOfCaller.class.getName());
+        PatternLayout.defaultConverterMap.put("ecompErrorCategory", EcompErrorCategory.class.getName());
+        PatternLayout.defaultConverterMap.put("ecompResponseCode", EcompResponseCode.class.getName());
+        PatternLayout.defaultConverterMap.put("ecompResponseDescription", EcompResponseDescription.class.getName());
+        PatternLayout.defaultConverterMap.put("ecompStatusCode", EcompStatusCode.class.getName());
+        PatternLayout.defaultConverterMap.put("ecompServiceName", EcompServiceName.class.getName());
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompResponseCode.java b/aai-core/src/main/java/org/onap/aai/logging/EcompResponseCode.java
index b57c6650..1dc59b4e 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompResponseCode.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompResponseCode.java
@@ -17,22 +17,23 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.logging;
 
-import org.onap.aai.logging.LoggingContext.LoggingField;
+package org.onap.aai.logging;
 
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
+import org.onap.aai.logging.LoggingContext.LoggingField;
+
 public class EcompResponseCode extends ClassicConverter {
 
-	@Override
-	public String convert(ILoggingEvent event) {
+    @Override
+    public String convert(ILoggingEvent event) {
 
-		if (!event.getMDCPropertyMap().containsKey(LoggingField.RESPONSE_CODE.toString())) {
-			// if response code is not set, return "unknown" (900)
-			return LoggingContext.UNKNOWN_ERROR;
-		}
-		return event.getMDCPropertyMap().get(LoggingField.RESPONSE_CODE.toString());
-	}
+        if (!event.getMDCPropertyMap().containsKey(LoggingField.RESPONSE_CODE.toString())) {
+            // if response code is not set, return "unknown" (900)
+            return LoggingContext.UNKNOWN_ERROR;
+        }
+        return event.getMDCPropertyMap().get(LoggingField.RESPONSE_CODE.toString());
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompResponseDescription.java b/aai-core/src/main/java/org/onap/aai/logging/EcompResponseDescription.java
index eb11c16b..4b2b3b46 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompResponseDescription.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompResponseDescription.java
@@ -17,28 +17,30 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.logging;
 
-import org.onap.aai.logging.LoggingContext.LoggingField;
+package org.onap.aai.logging;
 
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
+import org.onap.aai.logging.LoggingContext.LoggingField;
+
 public class EcompResponseDescription extends ClassicConverter {
-	public final static String DefaultDescription = "Unknown response/error description";
-	@Override
-	public String convert(ILoggingEvent event) {
+    public final static String DefaultDescription = "Unknown response/error description";
+
+    @Override
+    public String convert(ILoggingEvent event) {
 
-		if (!event.getMDCPropertyMap().containsKey(LoggingField.RESPONSE_DESCRIPTION.toString())) {
-			return (DefaultDescription);
-		}
-		// Replace pipes and new lines
-		String currentDesc = event.getMDCPropertyMap().get(LoggingField.RESPONSE_DESCRIPTION.toString());
-		if ( (currentDesc == null) || (currentDesc.length() == 0) ) {
-			return (DefaultDescription);
-		}
-		currentDesc = currentDesc.replaceAll("|", "!");
-		currentDesc = currentDesc.replaceAll("[\\r\\n]+", "^");
-		return event.getMDCPropertyMap().get(LoggingField.RESPONSE_DESCRIPTION.toString());
-	}
+        if (!event.getMDCPropertyMap().containsKey(LoggingField.RESPONSE_DESCRIPTION.toString())) {
+            return (DefaultDescription);
+        }
+        // Replace pipes and new lines
+        String currentDesc = event.getMDCPropertyMap().get(LoggingField.RESPONSE_DESCRIPTION.toString());
+        if ((currentDesc == null) || (currentDesc.length() == 0)) {
+            return (DefaultDescription);
+        }
+        currentDesc = currentDesc.replaceAll("|", "!");
+        currentDesc = currentDesc.replaceAll("[\\r\\n]+", "^");
+        return event.getMDCPropertyMap().get(LoggingField.RESPONSE_DESCRIPTION.toString());
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompServiceName.java b/aai-core/src/main/java/org/onap/aai/logging/EcompServiceName.java
index e20c841b..10d7a211 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompServiceName.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompServiceName.java
@@ -17,10 +17,12 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
+
 import org.onap.aai.logging.LoggingContext.LoggingField;
 
 public class EcompServiceName extends ClassicConverter {
@@ -32,4 +34,3 @@ public class EcompServiceName extends ClassicConverter {
         return event.getMDCPropertyMap().get(LoggingField.SERVICE_NAME.toString());
     }
 }
-
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompStartTime.java b/aai-core/src/main/java/org/onap/aai/logging/EcompStartTime.java
index ef383af6..8f015414 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompStartTime.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompStartTime.java
@@ -17,22 +17,23 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.logging;
 
-import org.onap.aai.logging.LoggingContext.LoggingField;
+package org.onap.aai.logging;
 
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
+import org.onap.aai.logging.LoggingContext.LoggingField;
+
 public class EcompStartTime extends ClassicConverter {
 
-	@Override
-	public String convert(ILoggingEvent event) {
+    @Override
+    public String convert(ILoggingEvent event) {
 
-		if (!event.getMDCPropertyMap().containsKey(LoggingField.START_TIME.toString())) {
-			return LogFormatTools.toDate(event.getTimeStamp());
-		}
+        if (!event.getMDCPropertyMap().containsKey(LoggingField.START_TIME.toString())) {
+            return LogFormatTools.toDate(event.getTimeStamp());
+        }
 
-		return event.getMDCPropertyMap().get(LoggingField.START_TIME.toString());
-	}
+        return event.getMDCPropertyMap().get(LoggingField.START_TIME.toString());
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EcompStatusCode.java b/aai-core/src/main/java/org/onap/aai/logging/EcompStatusCode.java
index 1ac4606b..4319bbbd 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EcompStatusCode.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EcompStatusCode.java
@@ -17,12 +17,14 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
-import org.onap.aai.logging.LoggingContext.LoggingField;
 import ch.qos.logback.classic.pattern.ClassicConverter;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
+import org.onap.aai.logging.LoggingContext.LoggingField;
+
 public class EcompStatusCode extends ClassicConverter {
     @Override
     public String convert(ILoggingEvent event) {
@@ -32,4 +34,3 @@ public class EcompStatusCode extends ClassicConverter {
         return event.getMDCPropertyMap().get(LoggingField.STATUS_CODE.toString());
     }
 }
-
diff --git a/aai-core/src/main/java/org/onap/aai/logging/EelfClassOfCaller.java b/aai-core/src/main/java/org/onap/aai/logging/EelfClassOfCaller.java
index f7ae2e93..dc9bc2c2 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/EelfClassOfCaller.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/EelfClassOfCaller.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import ch.qos.logback.classic.pattern.NamedConverter;
@@ -28,13 +29,13 @@ public class EelfClassOfCaller extends NamedConverter {
 
         StackTraceElement[] cda = event.getCallerData();
 
-		//If using the EELFLogger, it "hides" the calling class because it wraps the logging calls
-		//Without this, you'd only ever see "EELF SLF4jWrapper" when using the
-		// %C pattern converter
+        // If using the EELFLogger, it "hides" the calling class because it wraps the logging calls
+        // Without this, you'd only ever see "EELF SLF4jWrapper" when using the
+        // %C pattern converter
         if (cda != null && cda.length > 2) {
             return cda[2].getClassName();
         } else if (cda != null && cda.length > 0) {
-        	return cda[0].getClassName();
+            return cda[0].getClassName();
         } else {
             return CallerData.NA;
         }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/ErrorLogHelper.java b/aai-core/src/main/java/org/onap/aai/logging/ErrorLogHelper.java
index 7d97ffbf..01327606 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/ErrorLogHelper.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/ErrorLogHelper.java
@@ -17,8 +17,12 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -36,581 +40,594 @@ import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
 
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.MDC;
-
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.logging.LoggingContext.StatusCode;
 import org.onap.aai.util.AAIConfig;
 import org.onap.aai.util.AAIConstants;
 import org.onap.aai.util.MapperUtil;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
+import org.slf4j.MDC;
 
 /**
  * 
  * This classes loads the application error properties file
- * and provides a method that returns an ErrorObject 
+ * and provides a method that returns an ErrorObject
  * 
  */
 
 public class ErrorLogHelper {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ErrorLogHelper.class);
-	private static final HashMap ERROR_OBJECTS = new HashMap ();
-
-	static {
-		try {
-			loadProperties();
-		} catch (IOException e) {
-			throw new RuntimeException("Failed to load error.properties file", e);
-		} catch (ErrorObjectFormatException e) {
-			throw new RuntimeException("Failed to parse error.properties file", e);
-		}
-	}
-	
-	/**
-	 * Load properties.
-	 * @throws ErrorObjectFormatException
-	 * @throws Exception the exception
-	 */
-	public static void loadProperties() throws IOException, ErrorObjectFormatException {
-		final String filePath = AAIConstants.AAI_HOME_ETC_APP_PROPERTIES + "error.properties"; 
-		final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
-		final Properties properties = new Properties();
-		
-		if (is != null) {
-			properties.load(is);
-		} else {
-			try (final FileInputStream fis = new FileInputStream(filePath)) {
-				properties.load(fis);
-			}
-		}
-		
-		for (Entry entry : properties.entrySet()) {
-			final String key = (String) entry.getKey();
-			final String value = (String) entry.getValue();
-			final String[] errorProperties = value.split(":");
-
-			if (errorProperties.length != 7) throw new ErrorObjectFormatException();
-			
-			final ErrorObject errorObject = new ErrorObject();
-		
-			errorObject.setDisposition(errorProperties[0].trim());
-			errorObject.setCategory(errorProperties[1].trim());
-			errorObject.setSeverity(errorProperties[2].trim());
-			errorObject.setErrorCode(errorProperties[3].trim());
-			errorObject.setHTTPResponseCode(errorProperties[4].trim());
-			errorObject.setRESTErrorCode(errorProperties[5].trim());
-			errorObject.setErrorText(errorProperties[6].trim());
-			
-			ERROR_OBJECTS.put(key, errorObject);
-		}
-	}
-
-	/**
-	 * Logs a known A&AI exception (i.e. one that can be found in error.properties)
-	 *
-	 * @param key The key for the error in the error.properties file
-	 * @throws IOException 
-	 * @throws ErrorObjectNotFoundException 
-	 * @throws ErrorObjectFormatException 
-	 */
-	public static ErrorObject getErrorObject(String code) throws ErrorObjectNotFoundException {
-		
-		if (code == null) throw new IllegalArgumentException("Key cannot be null");
-		
-		final ErrorObject errorObject = ERROR_OBJECTS.get(code);
-		
-		if (errorObject == null) {
-			LOGGER.warn("Unknown AAIException with code=" + code + ".  Using default AAIException");
-			return ERROR_OBJECTS.get(AAIException.DEFAULT_EXCEPTION_CODE);
-		}
-		
-		return errorObject;
-	}
-
-	/**
-	 * Determines whether category is policy or not.  If policy (1), this is a POL error, else it's a SVC error.
-	 * The AAIRESTException may contain a different ErrorObject than that created with the REST error key.
-	 * This allows lower level exception detail to be returned to the client to help troubleshoot the problem.
-	 * If no error object is embedded in the AAIException, one will be created using the error object from the AAIException.
-	 * @param are must have a restError value whose numeric value must match what should be returned in the REST API
-	 * @param variables optional list of variables to flesh out text in error string
-	 * @return appropriately formatted JSON response per the REST API spec.
-	 * @throws ErrorObjectFormatException 
-	 * @throws ErrorObjectNotFoundException 
-	 * @throws IOException 
-	 * @deprecated
-	 */
-	public static String getRESTAPIErrorResponse(AAIException are, ArrayList variables) {
-		List acceptHeaders = new ArrayList();
-		acceptHeaders.add(MediaType.APPLICATION_JSON_TYPE);
-
-		return getRESTAPIErrorResponse(acceptHeaders, are, variables);
-	}
-
-	/**
-	 * Determines whether category is policy or not.  If policy (1), this is a POL error, else it's a SVC error.
-	 * The AAIRESTException may contain a different ErrorObject than that created with the REST error key.
-	 * This allows lower level exception detail to be returned to the client to help troubleshoot the problem.
-	 * If no error object is embedded in the AAIException, one will be created using the error object from the AAIException.
-	 *
-	 * @param acceptHeadersOrig the accept headers orig
-	 * @param are must have a restError value whose numeric value must match what should be returned in the REST API
-	 * @param variables optional list of variables to flesh out text in error string
-	 * @return appropriately formatted JSON response per the REST API spec.
-	 * @throws ErrorObjectFormatException 
-	 * @throws ErrorObjectNotFoundException 
-	 * @throws IOException 
-	 */
-	public static String getRESTAPIErrorResponse(List acceptHeadersOrig, AAIException are, ArrayList variables) {
-
-
-		StringBuilder text = new StringBuilder();
-		String response = null;
-		
-		List acceptHeaders = new ArrayList();
-		// we might have an exception but no accept header, so we'll set default to JSON
-		boolean foundValidAcceptHeader = false;
-		for (MediaType mt : acceptHeadersOrig) {
-			if (MediaType.APPLICATION_XML_TYPE.isCompatible(mt) ||
-					MediaType.APPLICATION_JSON_TYPE.isCompatible(mt)) {
-				acceptHeaders.add(mt);
-				foundValidAcceptHeader = true;
-			}
-		}
-		if (foundValidAcceptHeader == false) { 
-			// override the exception, client needs to set an appropriate Accept header
-			are = new AAIException("AAI_4014");
-			acceptHeaders.add(MediaType.APPLICATION_JSON_TYPE);
-		}
-
-		final ErrorObject eo = are.getErrorObject();
-		
-		int restErrorCode = Integer.parseInt(eo.getRESTErrorCode());
-		
-		ErrorObject restErrorObject;
-		
-		try {
-			restErrorObject = ErrorLogHelper.getErrorObject("AAI_"+restErrorCode);
-		} catch (ErrorObjectNotFoundException e) {
-			LOGGER.warn("Failed to find related error object AAI_" + restErrorCode + " for error object " + eo.getErrorCode() + "; using AAI_" + restErrorCode);
-			restErrorObject = eo;
-		}
-
-		text.append(restErrorObject.getErrorText());
-		
-		// We want to always append the (msg=%n) (ec=%n+1) to the text, but have to find value of n
-		// This assumes that the variables in the ArrayList, which might be more than are needed to flesh out the
-		// error, are ordered based on the error string.
-		int localDataIndex = StringUtils.countMatches(restErrorObject.getErrorText(), "%");
-		text.append(" (msg=%").append(localDataIndex+1).append(") (ec=%").append(localDataIndex+2).append(")");
-
-		if (variables == null) 
-		{
-			variables = new ArrayList();
-		}
-	
-		if (variables.size() < localDataIndex) {
-			ErrorLogHelper.logError("AAI_4011", "data missing for rest error");
-			while (variables.size() < localDataIndex) {
-				variables.add("null");
-			}
-		}
-		
-		// This will put the error code and error text into the right positions
-		if (are.getMessage() == null || are.getMessage().length() == 0) {
-			variables.add(localDataIndex++, eo.getErrorText());
-		}
-		else {
-			variables.add(localDataIndex++, eo.getErrorText() + ":" + are.getMessage());
-		}
-		variables.add(localDataIndex, eo.getErrorCodeString());
-		
-		for (MediaType mediaType : acceptHeaders) {
-		if (MediaType.APPLICATION_XML_TYPE.isCompatible(mediaType)) {
-				JAXBContext context = null;
-				try {
-					if(eo.getCategory().equals("1")) {
-						
-						context = JAXBContext.newInstance(org.onap.aai.domain.restPolicyException.Fault.class);
-						Marshaller m = context.createMarshaller();
-						m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-						m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
-						
-						org.onap.aai.domain.restPolicyException.ObjectFactory factory = new org.onap.aai.domain.restPolicyException.ObjectFactory();
-						org.onap.aai.domain.restPolicyException.Fault fault = factory.createFault();
-						org.onap.aai.domain.restPolicyException.Fault.RequestError requestError = factory.createFaultRequestError();
-						org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException policyException = factory.createFaultRequestErrorPolicyException();
-						org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException.Variables polvariables = factory.createFaultRequestErrorPolicyExceptionVariables();
-						
-						policyException.setMessageId("POL" + eo.getRESTErrorCode());
-						policyException.setText(text.toString());
-						for (int i=0;i acceptHeadersOrig, AAIException are, ArrayList variables) {
-		String response = ErrorLogHelper.getRESTAPIErrorResponse(acceptHeadersOrig, are, variables);
-		
-		LOGGER.error(are.getMessage() + " " + LogFormatTools.getStackTop(are));
-		
-		return response;
-	}
-	
-	/**
-	 * Gets the RESTAPI info response.
-	 *
-	 * @param acceptHeaders the accept headers
-	 * @param areList the are list
-	 * @return the RESTAPI info response
-	 * @throws ErrorObjectFormatException 
-	 * @throws ErrorObjectNotFoundException 
-	 * @throws IOException 
-	 */
-	public static Object getRESTAPIInfoResponse(List acceptHeaders, HashMap> areList) {
-		
-		Object respObj = null;
-
-		org.onap.aai.domain.restResponseInfo.ObjectFactory factory = new org.onap.aai.domain.restResponseInfo.ObjectFactory();
-		org.onap.aai.domain.restResponseInfo.Info info = factory.createInfo();
-		org.onap.aai.domain.restResponseInfo.Info.ResponseMessages responseMessages = factory.createInfoResponseMessages();
-		Iterator>> it = areList.entrySet().iterator();
-		
-		while (it.hasNext()) {
-			Entry> pair = (Entry>)it.next();
-			AAIException are = pair.getKey();
-			ArrayList variables = pair.getValue();
-
-			StringBuilder text = new StringBuilder();
-
-			ErrorObject eo = are.getErrorObject();
-			
-			int restErrorCode = Integer.parseInt(eo.getRESTErrorCode());
-			ErrorObject restErrorObject;
-			try {
-				restErrorObject = ErrorLogHelper.getErrorObject("AAI_"+String.format("%04d", restErrorCode));
-			} catch (ErrorObjectNotFoundException e) {
-				restErrorObject = eo;
-			}
-			text.append(restErrorObject.getErrorText());
-
-			// We want to always append the (msg=%n) (ec=%n+1) to the text, but have to find value of n
-			// This assumes that the variables in the ArrayList, which might be more than are needed to flesh out the
-			// error, are ordered based on the error string.
-			int localDataIndex = StringUtils.countMatches(restErrorObject.getErrorText(), "%");
-			text.append(" (msg=%").append(localDataIndex+1).append(") (rc=%").append(localDataIndex+2).append(")");
-
-			if (variables == null) 
-			{
-				variables = new ArrayList();
-			}
-
-			if (variables.size() < localDataIndex) {
-				ErrorLogHelper.logError("AAI_4011", "data missing for rest error");
-				while (variables.size() < localDataIndex) {
-					variables.add("null");
-				}
-			}
-
-			// This will put the error code and error text into the right positions
-			if (are.getMessage() == null) {
-				variables.add(localDataIndex++, eo.getErrorText());
-			}
-			else {
-				variables.add(localDataIndex++, eo.getErrorText() + ":" + are.getMessage());
-			}
-			variables.add(localDataIndex, eo.getErrorCodeString());
-		
-			try { 
-				org.onap.aai.domain.restResponseInfo.Info.ResponseMessages.ResponseMessage responseMessage = factory.createInfoResponseMessagesResponseMessage();
-				org.onap.aai.domain.restResponseInfo.Info.ResponseMessages.ResponseMessage.Variables infovariables = factory.createInfoResponseMessagesResponseMessageVariables();
-
-				responseMessage.setMessageId("INF" + eo.getRESTErrorCode());
-				responseMessage.setText(text.toString());
-				for (int i=0;i variables) {
-
-			StringBuilder text = new StringBuilder();
-			String response = null;
-			JAXBContext context = null;
-			
-			ErrorObject eo = are.getErrorObject();
-
-			int restErrorCode = Integer.parseInt(eo.getRESTErrorCode());
-			ErrorObject restErrorObject;
-			try {
-				restErrorObject = ErrorLogHelper.getErrorObject("AAI_"+restErrorCode);
-			} catch (ErrorObjectNotFoundException e) {
-				restErrorObject = eo;
-			}
-			
-			text.append(restErrorObject.getErrorText());
-
-			// We want to always append the (msg=%n) (ec=%n+1) to the text, but have to find value of n
-			// This assumes that the variables in the ArrayList, which might be more than are needed to flesh out the
-			// error, are ordered based on the error string.
-			int localDataIndex = StringUtils.countMatches(restErrorObject.getErrorText(), "%");
-			text.append(" (msg=%").append(localDataIndex+1).append(") (ec=%").append(localDataIndex+2).append(")");
-
-			if (variables == null) 
-			{
-				variables = new ArrayList();
-			}
-
-			if (variables.size() < localDataIndex) {
-				ErrorLogHelper.logError("AAI_4011", "data missing for rest error");
-				while (variables.size() < localDataIndex) {
-					variables.add("null");
-				}
-			}
-
-			// This will put the error code and error text into the right positions
-			if (are.getMessage() == null) {
-				variables.add(localDataIndex++, eo.getErrorText());
-			}
-			else {
-				variables.add(localDataIndex++, eo.getErrorText() + ":" + are.getMessage());
-			}
-			variables.add(localDataIndex, eo.getErrorCodeString());
-
-			try {
-				if(eo.getCategory().equals("1")) {
-
-					context = JAXBContext.newInstance(org.onap.aai.domain.restPolicyException.Fault.class);
-					Marshaller m = context.createMarshaller();
-					m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-					m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
-
-					org.onap.aai.domain.restPolicyException.ObjectFactory factory = new org.onap.aai.domain.restPolicyException.ObjectFactory();
-					org.onap.aai.domain.restPolicyException.Fault fault = factory.createFault();
-					org.onap.aai.domain.restPolicyException.Fault.RequestError requestError = factory.createFaultRequestError();
-					org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException policyException = factory.createFaultRequestErrorPolicyException();
-					org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException.Variables polvariables = factory.createFaultRequestErrorPolicyExceptionVariables();
-
-					policyException.setMessageId("POL" + eo.getRESTErrorCode());
-					policyException.setText(text.toString());
-					for (int i=0;i 0 && sevCode <= 3 )
-			{
-				LoggingContext.severity(sevCode);
-			}
-		}
-		String stackTrace = "";
-		try {
-			stackTrace = LogFormatTools.getStackTop(e);
-		}
-		catch (Exception a) {
-			//ignore
-		}
-		final String errorMessage = new StringBuilder()
-											.append(errorObject.getErrorText())
-											.append(":")
-											.append(errorObject.getRESTErrorCode())
-											.append(":")
-											.append(errorObject.getHTTPResponseCode())
-											.append(":")
-											.append(e.getMessage())
-											.toString()
-                                            .replaceAll("\\n", "^");
-
-		LoggingContext.responseCode(Integer.toString(errorObject.getHTTPResponseCode().getStatusCode()));
-		LoggingContext.responseDescription(errorMessage);
-		LoggingContext.statusCode(StatusCode.ERROR);
-
-		final String details = new StringBuilder().append(errorObject.getErrorCodeString())
-				.append(" ")
-				.append(stackTrace)
-				.toString();
-		
-		if (errorObject.getSeverity().equalsIgnoreCase("WARN"))
-			LOGGER.warn(details);
-		else if (errorObject.getSeverity().equalsIgnoreCase("ERROR"))
-			LOGGER.error(details);
-		else if (errorObject.getSeverity().equalsIgnoreCase("FATAL"))
-			LOGGER.error(details);
-		else if (errorObject.getSeverity().equals("INFO"))
-			LOGGER.info(details);
-	}
-
-	public static void logError(String code) {
-		logError(code, "");
-	}
-	
-	public static void logError(String code, String message) {
-		logException(new AAIException(code, message));
-	}
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ErrorLogHelper.class);
+    private static final HashMap ERROR_OBJECTS = new HashMap();
+
+    static {
+        try {
+            loadProperties();
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load error.properties file", e);
+        } catch (ErrorObjectFormatException e) {
+            throw new RuntimeException("Failed to parse error.properties file", e);
+        }
+    }
+
+    /**
+     * Load properties.
+     * 
+     * @throws ErrorObjectFormatException
+     * @throws Exception the exception
+     */
+    public static void loadProperties() throws IOException, ErrorObjectFormatException {
+        final String filePath = AAIConstants.AAI_HOME_ETC_APP_PROPERTIES + "error.properties";
+        final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
+        final Properties properties = new Properties();
+
+        if (is != null) {
+            properties.load(is);
+        } else {
+            try (final FileInputStream fis = new FileInputStream(filePath)) {
+                properties.load(fis);
+            }
+        }
+
+        for (Entry entry : properties.entrySet()) {
+            final String key = (String) entry.getKey();
+            final String value = (String) entry.getValue();
+            final String[] errorProperties = value.split(":");
+
+            if (errorProperties.length != 7)
+                throw new ErrorObjectFormatException();
+
+            final ErrorObject errorObject = new ErrorObject();
+
+            errorObject.setDisposition(errorProperties[0].trim());
+            errorObject.setCategory(errorProperties[1].trim());
+            errorObject.setSeverity(errorProperties[2].trim());
+            errorObject.setErrorCode(errorProperties[3].trim());
+            errorObject.setHTTPResponseCode(errorProperties[4].trim());
+            errorObject.setRESTErrorCode(errorProperties[5].trim());
+            errorObject.setErrorText(errorProperties[6].trim());
+
+            ERROR_OBJECTS.put(key, errorObject);
+        }
+    }
+
+    /**
+     * Logs a known A&AI exception (i.e. one that can be found in error.properties)
+     *
+     * @param key The key for the error in the error.properties file
+     * @throws IOException
+     * @throws ErrorObjectNotFoundException
+     * @throws ErrorObjectFormatException
+     */
+    public static ErrorObject getErrorObject(String code) throws ErrorObjectNotFoundException {
+
+        if (code == null)
+            throw new IllegalArgumentException("Key cannot be null");
+
+        final ErrorObject errorObject = ERROR_OBJECTS.get(code);
+
+        if (errorObject == null) {
+            LOGGER.warn("Unknown AAIException with code=" + code + ".  Using default AAIException");
+            return ERROR_OBJECTS.get(AAIException.DEFAULT_EXCEPTION_CODE);
+        }
+
+        return errorObject;
+    }
+
+    /**
+     * Determines whether category is policy or not. If policy (1), this is a POL error, else it's a SVC error.
+     * The AAIRESTException may contain a different ErrorObject than that created with the REST error key.
+     * This allows lower level exception detail to be returned to the client to help troubleshoot the problem.
+     * If no error object is embedded in the AAIException, one will be created using the error object from the
+     * AAIException.
+     * 
+     * @param are must have a restError value whose numeric value must match what should be returned in the REST API
+     * @param variables optional list of variables to flesh out text in error string
+     * @return appropriately formatted JSON response per the REST API spec.
+     * @throws ErrorObjectFormatException
+     * @throws ErrorObjectNotFoundException
+     * @throws IOException
+     * @deprecated
+     */
+    public static String getRESTAPIErrorResponse(AAIException are, ArrayList variables) {
+        List acceptHeaders = new ArrayList();
+        acceptHeaders.add(MediaType.APPLICATION_JSON_TYPE);
+
+        return getRESTAPIErrorResponse(acceptHeaders, are, variables);
+    }
+
+    /**
+     * Determines whether category is policy or not. If policy (1), this is a POL error, else it's a SVC error.
+     * The AAIRESTException may contain a different ErrorObject than that created with the REST error key.
+     * This allows lower level exception detail to be returned to the client to help troubleshoot the problem.
+     * If no error object is embedded in the AAIException, one will be created using the error object from the
+     * AAIException.
+     *
+     * @param acceptHeadersOrig the accept headers orig
+     * @param are must have a restError value whose numeric value must match what should be returned in the REST API
+     * @param variables optional list of variables to flesh out text in error string
+     * @return appropriately formatted JSON response per the REST API spec.
+     * @throws ErrorObjectFormatException
+     * @throws ErrorObjectNotFoundException
+     * @throws IOException
+     */
+    public static String getRESTAPIErrorResponse(List acceptHeadersOrig, AAIException are,
+            ArrayList variables) {
+
+        StringBuilder text = new StringBuilder();
+        String response = null;
+
+        List acceptHeaders = new ArrayList();
+        // we might have an exception but no accept header, so we'll set default to JSON
+        boolean foundValidAcceptHeader = false;
+        for (MediaType mt : acceptHeadersOrig) {
+            if (MediaType.APPLICATION_XML_TYPE.isCompatible(mt) || MediaType.APPLICATION_JSON_TYPE.isCompatible(mt)) {
+                acceptHeaders.add(mt);
+                foundValidAcceptHeader = true;
+            }
+        }
+        if (foundValidAcceptHeader == false) {
+            // override the exception, client needs to set an appropriate Accept header
+            are = new AAIException("AAI_4014");
+            acceptHeaders.add(MediaType.APPLICATION_JSON_TYPE);
+        }
+
+        final ErrorObject eo = are.getErrorObject();
+
+        int restErrorCode = Integer.parseInt(eo.getRESTErrorCode());
+
+        ErrorObject restErrorObject;
+
+        try {
+            restErrorObject = ErrorLogHelper.getErrorObject("AAI_" + restErrorCode);
+        } catch (ErrorObjectNotFoundException e) {
+            LOGGER.warn("Failed to find related error object AAI_" + restErrorCode + " for error object "
+                    + eo.getErrorCode() + "; using AAI_" + restErrorCode);
+            restErrorObject = eo;
+        }
+
+        text.append(restErrorObject.getErrorText());
+
+        // We want to always append the (msg=%n) (ec=%n+1) to the text, but have to find value of n
+        // This assumes that the variables in the ArrayList, which might be more than are needed to flesh out the
+        // error, are ordered based on the error string.
+        int localDataIndex = StringUtils.countMatches(restErrorObject.getErrorText(), "%");
+        text.append(" (msg=%").append(localDataIndex + 1).append(") (ec=%").append(localDataIndex + 2).append(")");
+
+        if (variables == null) {
+            variables = new ArrayList();
+        }
+
+        if (variables.size() < localDataIndex) {
+            ErrorLogHelper.logError("AAI_4011", "data missing for rest error");
+            while (variables.size() < localDataIndex) {
+                variables.add("null");
+            }
+        }
+
+        // This will put the error code and error text into the right positions
+        if (are.getMessage() == null || are.getMessage().length() == 0) {
+            variables.add(localDataIndex++, eo.getErrorText());
+        } else {
+            variables.add(localDataIndex++, eo.getErrorText() + ":" + are.getMessage());
+        }
+        variables.add(localDataIndex, eo.getErrorCodeString());
+
+        for (MediaType mediaType : acceptHeaders) {
+            if (MediaType.APPLICATION_XML_TYPE.isCompatible(mediaType)) {
+                JAXBContext context = null;
+                try {
+                    if (eo.getCategory().equals("1")) {
+
+                        context = JAXBContext.newInstance(org.onap.aai.domain.restPolicyException.Fault.class);
+                        Marshaller m = context.createMarshaller();
+                        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+                        m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
+
+                        org.onap.aai.domain.restPolicyException.ObjectFactory factory =
+                                new org.onap.aai.domain.restPolicyException.ObjectFactory();
+                        org.onap.aai.domain.restPolicyException.Fault fault = factory.createFault();
+                        org.onap.aai.domain.restPolicyException.Fault.RequestError requestError =
+                                factory.createFaultRequestError();
+                        org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException policyException =
+                                factory.createFaultRequestErrorPolicyException();
+                        org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException.Variables polvariables =
+                                factory.createFaultRequestErrorPolicyExceptionVariables();
+
+                        policyException.setMessageId("POL" + eo.getRESTErrorCode());
+                        policyException.setText(text.toString());
+                        for (int i = 0; i < variables.size(); i++) {
+                            polvariables.getVariable().add(variables.get(i));
+                        }
+                        policyException.setVariables(polvariables);
+                        requestError.setPolicyException(policyException);
+                        fault.setRequestError(requestError);
+
+                        StringWriter sw = new StringWriter();
+                        m.marshal(fault, sw);
+
+                        response = sw.toString();
+
+                    } else {
+
+                        context = JAXBContext.newInstance(org.onap.aai.domain.restServiceException.Fault.class);
+                        Marshaller m = context.createMarshaller();
+                        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+                        m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
+
+                        org.onap.aai.domain.restServiceException.ObjectFactory factory =
+                                new org.onap.aai.domain.restServiceException.ObjectFactory();
+                        org.onap.aai.domain.restServiceException.Fault fault = factory.createFault();
+                        org.onap.aai.domain.restServiceException.Fault.RequestError requestError =
+                                factory.createFaultRequestError();
+                        org.onap.aai.domain.restServiceException.Fault.RequestError.ServiceException serviceException =
+                                factory.createFaultRequestErrorServiceException();
+                        org.onap.aai.domain.restServiceException.Fault.RequestError.ServiceException.Variables svcvariables =
+                                factory.createFaultRequestErrorServiceExceptionVariables();
+                        serviceException.setMessageId("SVC" + eo.getRESTErrorCode());
+                        serviceException.setText(text.toString());
+                        for (int i = 0; i < variables.size(); i++) {
+                            svcvariables.getVariable().add(variables.get(i));
+                        }
+                        serviceException.setVariables(svcvariables);
+                        requestError.setServiceException(serviceException);
+                        fault.setRequestError(requestError);
+
+                        StringWriter sw = new StringWriter();
+                        m.marshal(fault, sw);
+
+                        response = sw.toString();
+
+                    }
+                } catch (Exception ex) {
+                    LOGGER.error(
+                            "We were unable to create a rest exception to return on an API because of a parsing error "
+                                    + ex.getMessage());
+                }
+            } else {
+                try {
+                    if (eo.getCategory().equals("1")) {
+                        org.onap.aai.domain.restPolicyException.RESTResponse restresp =
+                                new org.onap.aai.domain.restPolicyException.RESTResponse();
+                        org.onap.aai.domain.restPolicyException.RequestError reqerr =
+                                new org.onap.aai.domain.restPolicyException.RequestError();
+                        org.onap.aai.domain.restPolicyException.PolicyException polexc =
+                                new org.onap.aai.domain.restPolicyException.PolicyException();
+                        polexc.setMessageId("POL" + eo.getRESTErrorCode());
+                        polexc.setText(text.toString());
+                        polexc.setVariables(variables);
+                        reqerr.setPolicyException(polexc);
+                        restresp.setRequestError(reqerr);
+                        response = (MapperUtil.writeAsJSONString((Object) restresp));
+
+                    } else {
+                        org.onap.aai.domain.restServiceException.RESTResponse restresp =
+                                new org.onap.aai.domain.restServiceException.RESTResponse();
+                        org.onap.aai.domain.restServiceException.RequestError reqerr =
+                                new org.onap.aai.domain.restServiceException.RequestError();
+                        org.onap.aai.domain.restServiceException.ServiceException svcexc =
+                                new org.onap.aai.domain.restServiceException.ServiceException();
+                        svcexc.setMessageId("SVC" + eo.getRESTErrorCode());
+                        svcexc.setText(text.toString());
+                        svcexc.setVariables(variables);
+                        reqerr.setServiceException(svcexc);
+                        restresp.setRequestError(reqerr);
+                        response = (MapperUtil.writeAsJSONString((Object) restresp));
+                    }
+                } catch (AAIException ex) {
+                    LOGGER.error(
+                            "We were unable to create a rest exception to return on an API because of a parsing error "
+                                    + ex.getMessage());
+                }
+            }
+        }
+
+        return response;
+    }
+
+    /**
+     * Gets the RESTAPI error response with logging.
+     *
+     * @param acceptHeadersOrig the accept headers orig
+     * @param are the are
+     * @param variables the variables
+     * @param logline the logline
+     * @return the RESTAPI error response with logging
+     * @throws ErrorObjectFormatException
+     * @throws ErrorObjectNotFoundException
+     * @throws IOException
+     */
+    public static String getRESTAPIErrorResponseWithLogging(List acceptHeadersOrig, AAIException are,
+            ArrayList variables) {
+        String response = ErrorLogHelper.getRESTAPIErrorResponse(acceptHeadersOrig, are, variables);
+
+        LOGGER.error(are.getMessage() + " " + LogFormatTools.getStackTop(are));
+
+        return response;
+    }
+
+    /**
+     * Gets the RESTAPI info response.
+     *
+     * @param acceptHeaders the accept headers
+     * @param areList the are list
+     * @return the RESTAPI info response
+     * @throws ErrorObjectFormatException
+     * @throws ErrorObjectNotFoundException
+     * @throws IOException
+     */
+    public static Object getRESTAPIInfoResponse(List acceptHeaders,
+            HashMap> areList) {
+
+        Object respObj = null;
+
+        org.onap.aai.domain.restResponseInfo.ObjectFactory factory =
+                new org.onap.aai.domain.restResponseInfo.ObjectFactory();
+        org.onap.aai.domain.restResponseInfo.Info info = factory.createInfo();
+        org.onap.aai.domain.restResponseInfo.Info.ResponseMessages responseMessages =
+                factory.createInfoResponseMessages();
+        Iterator>> it = areList.entrySet().iterator();
+
+        while (it.hasNext()) {
+            Entry> pair = (Entry>) it.next();
+            AAIException are = pair.getKey();
+            ArrayList variables = pair.getValue();
+
+            StringBuilder text = new StringBuilder();
+
+            ErrorObject eo = are.getErrorObject();
+
+            int restErrorCode = Integer.parseInt(eo.getRESTErrorCode());
+            ErrorObject restErrorObject;
+            try {
+                restErrorObject = ErrorLogHelper.getErrorObject("AAI_" + String.format("%04d", restErrorCode));
+            } catch (ErrorObjectNotFoundException e) {
+                restErrorObject = eo;
+            }
+            text.append(restErrorObject.getErrorText());
+
+            // We want to always append the (msg=%n) (ec=%n+1) to the text, but have to find value of n
+            // This assumes that the variables in the ArrayList, which might be more than are needed to flesh out the
+            // error, are ordered based on the error string.
+            int localDataIndex = StringUtils.countMatches(restErrorObject.getErrorText(), "%");
+            text.append(" (msg=%").append(localDataIndex + 1).append(") (rc=%").append(localDataIndex + 2).append(")");
+
+            if (variables == null) {
+                variables = new ArrayList();
+            }
+
+            if (variables.size() < localDataIndex) {
+                ErrorLogHelper.logError("AAI_4011", "data missing for rest error");
+                while (variables.size() < localDataIndex) {
+                    variables.add("null");
+                }
+            }
+
+            // This will put the error code and error text into the right positions
+            if (are.getMessage() == null) {
+                variables.add(localDataIndex++, eo.getErrorText());
+            } else {
+                variables.add(localDataIndex++, eo.getErrorText() + ":" + are.getMessage());
+            }
+            variables.add(localDataIndex, eo.getErrorCodeString());
+
+            try {
+                org.onap.aai.domain.restResponseInfo.Info.ResponseMessages.ResponseMessage responseMessage =
+                        factory.createInfoResponseMessagesResponseMessage();
+                org.onap.aai.domain.restResponseInfo.Info.ResponseMessages.ResponseMessage.Variables infovariables =
+                        factory.createInfoResponseMessagesResponseMessageVariables();
+
+                responseMessage.setMessageId("INF" + eo.getRESTErrorCode());
+                responseMessage.setText(text.toString());
+                for (int i = 0; i < variables.size(); i++) {
+                    infovariables.getVariable().add(variables.get(i));
+                }
+
+                responseMessage.setVariables(infovariables);
+                responseMessages.getResponseMessage().add(responseMessage);
+
+            } catch (Exception ex) {
+                LOGGER.error("We were unable to create a rest exception to return on an API because of a parsing error "
+                        + ex.getMessage());
+            }
+        }
+
+        info.setResponseMessages(responseMessages);
+        respObj = (Object) info;
+
+        return respObj;
+    }
+
+    /**
+     * Determines whether category is policy or not. If policy (1), this is a POL error, else it's a SVC error.
+     * The AAIRESTException may contain a different ErrorObject than that created with the REST error key.
+     * This allows lower level exception detail to be returned to the client to help troubleshoot the problem.
+     * If no error object is embedded in the AAIException, one will be created using the error object from the
+     * AAIException.
+     * 
+     * @param are must have a restError value whose numeric value must match what should be returned in the REST API
+     * @param variables optional list of variables to flesh out text in error string
+     * @return appropriately formatted JSON response per the REST API spec.
+     * @throws ErrorObjectFormatException
+     * @throws ErrorObjectNotFoundException
+     * @throws IOException
+     */
+    public static String getRESTAPIPolicyErrorResponseXML(AAIException are, ArrayList variables) {
+
+        StringBuilder text = new StringBuilder();
+        String response = null;
+        JAXBContext context = null;
+
+        ErrorObject eo = are.getErrorObject();
+
+        int restErrorCode = Integer.parseInt(eo.getRESTErrorCode());
+        ErrorObject restErrorObject;
+        try {
+            restErrorObject = ErrorLogHelper.getErrorObject("AAI_" + restErrorCode);
+        } catch (ErrorObjectNotFoundException e) {
+            restErrorObject = eo;
+        }
+
+        text.append(restErrorObject.getErrorText());
+
+        // We want to always append the (msg=%n) (ec=%n+1) to the text, but have to find value of n
+        // This assumes that the variables in the ArrayList, which might be more than are needed to flesh out the
+        // error, are ordered based on the error string.
+        int localDataIndex = StringUtils.countMatches(restErrorObject.getErrorText(), "%");
+        text.append(" (msg=%").append(localDataIndex + 1).append(") (ec=%").append(localDataIndex + 2).append(")");
+
+        if (variables == null) {
+            variables = new ArrayList();
+        }
+
+        if (variables.size() < localDataIndex) {
+            ErrorLogHelper.logError("AAI_4011", "data missing for rest error");
+            while (variables.size() < localDataIndex) {
+                variables.add("null");
+            }
+        }
+
+        // This will put the error code and error text into the right positions
+        if (are.getMessage() == null) {
+            variables.add(localDataIndex++, eo.getErrorText());
+        } else {
+            variables.add(localDataIndex++, eo.getErrorText() + ":" + are.getMessage());
+        }
+        variables.add(localDataIndex, eo.getErrorCodeString());
+
+        try {
+            if (eo.getCategory().equals("1")) {
+
+                context = JAXBContext.newInstance(org.onap.aai.domain.restPolicyException.Fault.class);
+                Marshaller m = context.createMarshaller();
+                m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+                m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
+
+                org.onap.aai.domain.restPolicyException.ObjectFactory factory =
+                        new org.onap.aai.domain.restPolicyException.ObjectFactory();
+                org.onap.aai.domain.restPolicyException.Fault fault = factory.createFault();
+                org.onap.aai.domain.restPolicyException.Fault.RequestError requestError =
+                        factory.createFaultRequestError();
+                org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException policyException =
+                        factory.createFaultRequestErrorPolicyException();
+                org.onap.aai.domain.restPolicyException.Fault.RequestError.PolicyException.Variables polvariables =
+                        factory.createFaultRequestErrorPolicyExceptionVariables();
+
+                policyException.setMessageId("POL" + eo.getRESTErrorCode());
+                policyException.setText(text.toString());
+                for (int i = 0; i < variables.size(); i++) {
+                    polvariables.getVariable().add(variables.get(i));
+                }
+                policyException.setVariables(polvariables);
+                requestError.setPolicyException(policyException);
+                fault.setRequestError(requestError);
+
+                StringWriter sw = new StringWriter();
+                m.marshal(fault, sw);
+
+                response = sw.toString();
+
+            } else {
+
+                context = JAXBContext.newInstance(org.onap.aai.domain.restServiceException.Fault.class);
+                Marshaller m = context.createMarshaller();
+                m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+                m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
+
+                org.onap.aai.domain.restServiceException.ObjectFactory factory =
+                        new org.onap.aai.domain.restServiceException.ObjectFactory();
+                org.onap.aai.domain.restServiceException.Fault fault = factory.createFault();
+                org.onap.aai.domain.restServiceException.Fault.RequestError requestError =
+                        factory.createFaultRequestError();
+                org.onap.aai.domain.restServiceException.Fault.RequestError.ServiceException serviceException =
+                        factory.createFaultRequestErrorServiceException();
+                org.onap.aai.domain.restServiceException.Fault.RequestError.ServiceException.Variables svcvariables =
+                        factory.createFaultRequestErrorServiceExceptionVariables();
+                serviceException.setMessageId("POL" + eo.getRESTErrorCode());
+                serviceException.setText(text.toString());
+                for (int i = 0; i < variables.size(); i++) {
+                    svcvariables.getVariable().add(variables.get(i));
+                }
+                serviceException.setVariables(svcvariables);
+                requestError.setServiceException(serviceException);
+                fault.setRequestError(requestError);
+
+                StringWriter sw = new StringWriter();
+                m.marshal(fault, sw);
+
+                response = sw.toString();
+
+            }
+        } catch (Exception ex) {
+            LOGGER.error("We were unable to create a rest exception to return on an API because of a parsing error "
+                    + ex.getMessage());
+        }
+        return response;
+    }
+
+    public static void logException(AAIException e) {
+        final ErrorObject errorObject = e.getErrorObject();
+
+        // MDC.put("severity", errorObject.getSeverity()); //TODO Use LoggingContext.severity(int severity)
+        String severityCode = errorObject.getSeverityCode(errorObject.getSeverity());
+
+        if (!AAIConfig.isEmpty(severityCode)) {
+            int sevCode = Integer.parseInt(severityCode);
+            if (sevCode > 0 && sevCode <= 3) {
+                LoggingContext.severity(sevCode);
+            }
+        }
+        String stackTrace = "";
+        try {
+            stackTrace = LogFormatTools.getStackTop(e);
+        } catch (Exception a) {
+            // ignore
+        }
+        final String errorMessage = new StringBuilder().append(errorObject.getErrorText()).append(":")
+                .append(errorObject.getRESTErrorCode()).append(":").append(errorObject.getHTTPResponseCode())
+                .append(":").append(e.getMessage()).toString().replaceAll("\\n", "^");
+
+        LoggingContext.responseCode(Integer.toString(errorObject.getHTTPResponseCode().getStatusCode()));
+        LoggingContext.responseDescription(errorMessage);
+        LoggingContext.statusCode(StatusCode.ERROR);
+
+        final String details =
+                new StringBuilder().append(errorObject.getErrorCodeString()).append(" ").append(stackTrace).toString();
+
+        if (errorObject.getSeverity().equalsIgnoreCase("WARN"))
+            LOGGER.warn(details);
+        else if (errorObject.getSeverity().equalsIgnoreCase("ERROR"))
+            LOGGER.error(details);
+        else if (errorObject.getSeverity().equalsIgnoreCase("FATAL"))
+            LOGGER.error(details);
+        else if (errorObject.getSeverity().equals("INFO"))
+            LOGGER.info(details);
+    }
+
+    public static void logError(String code) {
+        logError(code, "");
+    }
+
+    public static void logError(String code, String message) {
+        logException(new AAIException(code, message));
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/ErrorObject.java b/aai-core/src/main/java/org/onap/aai/logging/ErrorObject.java
index c39b5a61..6048c18b 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/ErrorObject.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/ErrorObject.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import javax.ws.rs.core.Response.Status;
@@ -25,325 +26,334 @@ import javax.ws.rs.core.Response.Status;
  * 
  * Contains the definition of all error message fields to be mapped from the Error
  * properties file
- *  
+ * 
  */
 public class ErrorObject {
-	
-	private String disposition;
-	private String category;
-	private String severity;
-	private Status httpResponseCode = Status.INTERNAL_SERVER_ERROR; // default
-	private String restErrorCode = "3002";
-	private String errorCode;
-	private String errorText;
-	private String details;
-
-	/**
-	 * Instantiates a new error object.
-	 */
-	public ErrorObject() {
-		super();
-	}
-
-	/**
-	 * Creates an error object with the default HTTP Error Code (Status.INTERNAL_SERVER_ERROR)
-	 *
-	 * @param disposition the disposition
-	 * @param category the category
-	 * @param severity the severity
-	 * @param httpResponseCode the http response code
-	 * @param restErrorCode the rest error code
-	 * @param errorCode the error code
-	 * @param errorText the error text
-	 */
-	public ErrorObject(String disposition, String category, String severity, Integer httpResponseCode, String restErrorCode, String errorCode, String errorText) {
-		super();
-		this.setDisposition(disposition);
-		this.setCategory(category);
-		this.severity = severity;
-		this.setHTTPResponseCode(httpResponseCode);
-		this.setRESTErrorCode(restErrorCode);
-		this.setErrorCode(errorCode);
-		this.setErrorText(errorText);
-	}
-
-	// OLD STARTS HERE
-
-	/**
-	 * Instantiates a new error object.
-	 *
-	 * @param severity the severity
-	 * @param errorCode the error code
-	 * @param errorText the error text
-	 * @param disposition the disposition
-	 * @param category the category
-	 */
-	public ErrorObject(String severity, String errorCode, String errorText, String disposition, String category) {
-		this(severity, Status.INTERNAL_SERVER_ERROR, errorCode, errorText, disposition, category);
-	}
-	
-	/**
-	 * Instantiates a new error object.
-	 *
-	 * @param severity the severity
-	 * @param httpResponseCode the http response code
-	 * @param errorCode the error code
-	 * @param errorText the error text
-	 * @param disposition the disposition
-	 * @param category the category
-	 */
-	public ErrorObject(String severity, Integer httpResponseCode, String errorCode, String errorText, String disposition, String category) {
-		super();
-		this.severity = severity;
-		this.setHTTPResponseCode(httpResponseCode);
-		this.setErrorCode(errorCode);
-		this.setErrorText(errorText);
-		this.setDisposition(disposition);
-		this.setCategory(category);
-	}
-	
-	/**
-	 * Instantiates a new error object.
-	 *
-	 * @param severity the severity
-	 * @param httpResponseCode the http response code
-	 * @param errorCode the error code
-	 * @param errorText the error text
-	 * @param disposition the disposition
-	 * @param category the category
-	 */
-	public ErrorObject(String severity, Status httpResponseCode, String errorCode, String errorText, String disposition, String category) {
-		super();
-		this.severity = severity;
-		this.setHTTPResponseCode(httpResponseCode);
-		this.setErrorCode(errorCode);
-		this.setErrorText(errorText);
-		this.setDisposition(disposition);
-		this.setCategory(category);
-	}
-	
-	/**
-	 * Gets the disposition.
-	 *
-	 * @return the disposition
-	 */
-	public String getDisposition() {
-		return disposition;
-	}
-
-	/**
-	 * Sets the disposition.
-	 *
-	 * @param disposition the new disposition
-	 */
-	public void setDisposition(String disposition) {
-		this.disposition = disposition;
-	}
-
-	/**
-	 * Gets the category.
-	 *
-	 * @return the category
-	 */
-	public String getCategory() {
-		return category;
-	}
-
-	/**
-	 * Sets the category.
-	 *
-	 * @param category the new category
-	 */
-	public void setCategory(String category) {
-		this.category = category;
-	}
-	
-	/**
-	 * Gets the severity.
-	 *
-	 * @return the severity
-	 */
-	public String getSeverity() {
-		return severity;
-	}
-
-	/**
-	 * Sets the severity.
-	 *
-	 * @param severity the new severity
-	 */
-	public void setSeverity(String severity) {
-		this.severity = severity;
-	}
-
-	/**
-	 * Gets the error code.
-	 *
-	 * @return the error code
-	 */
-	public String getErrorCode() {
-		return errorCode;
-	}
-
-	/**
-	 * Sets the error code.
-	 *
-	 * @param errorCode the new error code
-	 */
-	public void setErrorCode(String errorCode) {
-		this.errorCode = errorCode;
-	}
-	
-	/**
-	 * Gets the HTTP response code.
-	 *
-	 * @return the HTTP response code
-	 */
-	public Status getHTTPResponseCode() {
-		return httpResponseCode;
-	}
-
-	/**
-	 * Sets the HTTP response code.
-	 *
-	 * @param httpResponseCode the new HTTP response code
-	 */
-	public void setHTTPResponseCode(Integer httpResponseCode) {
-		this.httpResponseCode = Status.fromStatusCode(httpResponseCode);
-		if (this.httpResponseCode == null) {
-			throw new IllegalArgumentException("setHTTPResponseCode was passed an invalid Integer value, fix error.properties or your code "+httpResponseCode);
-		}
-	}
-	
-	/**
-	 * Sets the HTTP response code.
-	 *
-	 * @param httpResponseCode the new HTTP response code
-	 */
-	public void setHTTPResponseCode(String httpResponseCode) {
-		this.httpResponseCode = Status.fromStatusCode(Integer.valueOf(httpResponseCode));
-		if (this.httpResponseCode == null) {
-			throw new IllegalArgumentException("setHTTPResponseCode was passed an invalid String value, fix error.properties or your code "+httpResponseCode);
-		}
-	}
-	
-	/**
-	 * Sets the REST error code.
-	 *
-	 * @param restErrorCode the new REST error code
-	 */
-	public void setRESTErrorCode(String restErrorCode) {
-		this.restErrorCode = restErrorCode;
-	}
-	
-	/**
-	 * Gets the REST error code.
-	 *
-	 * @return the REST error code
-	 */
-	public String getRESTErrorCode() {
-		return this.restErrorCode;
-	}
-	
-	/**
-	 * Sets the HTTP response code.
-	 *
-	 * @param httpResponseCode the new HTTP response code
-	 */
-	public void setHTTPResponseCode(Status httpResponseCode) {
-		this.httpResponseCode = httpResponseCode;
-		if (this.httpResponseCode == null) {
-			throw new IllegalArgumentException("setHTTPResponseCode was passed an invalid String value, fix error.properties or your code "+httpResponseCode);
-		}
-	}
-
-	/**
-	 * Gets the error text.
-	 *
-	 * @return the error text
-	 */
-	public String getErrorText() {
-		return errorText;
-	}
-
-	/**
-	 * Sets the error text.
-	 *
-	 * @param errorText the new error text
-	 */
-	public void setErrorText(String errorText) {
-		this.errorText = errorText;
-	}
-
-	/**
-	 * Gets the details.
-	 *
-	 * @return the details
-	 */
-	public String getDetails() {
-		return details;
-	}
-
-	/**
-	 * Sets the details.
-	 *
-	 * @param details the new details
-	 */
-	public void setDetails(String details) {
-		this.details = details == null ? "" : details;
-	}
-	
-	/**
-	 * Gets the error code string.  This is also the string
-	 * configured in Nagios to alert on
-	 *
-	 * @return the error code string
-	 */
-	// Get the X.Y.Z representation of the error code
-	public String getErrorCodeString() {
-		String prefix = null;
-		switch (disposition) {
-		default:
-			prefix = "";
-			break;
-		case "5":
-			prefix = "ERR.";
-			break;
-		}
-		return prefix + disposition + "." + category + "." + errorCode;
-	}
-	
-	/**
-	 * Gets the severity Code.  This is also the string
-	 * configured in Nagios to alert on
-	 *
-	 * @return the severity
-	 */
-	// Get the numerical value of severity
-	public String getSeverityCode(String severity) {
-		String severityCode = "";
-		switch (severity) {
-		case "WARN":
-			severityCode = "1";
-			break;
-		case "ERROR":
-			severityCode = "2";
-			break;
-		case "FATAL":
-			severityCode = "3";
-			break;
-		}
-		return severityCode;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public String toString() {
-		return "ErrorObject [errorCode="+ errorCode + ", errorText=" + errorText
-				+ ", restErrorCode=" + restErrorCode + ", httpResponseCode="+ httpResponseCode
-				+ ", severity=" + severity + ", disposition=" + disposition + ", category=" + category +"]";
-	}
-	
+
+    private String disposition;
+    private String category;
+    private String severity;
+    private Status httpResponseCode = Status.INTERNAL_SERVER_ERROR; // default
+    private String restErrorCode = "3002";
+    private String errorCode;
+    private String errorText;
+    private String details;
+
+    /**
+     * Instantiates a new error object.
+     */
+    public ErrorObject() {
+        super();
+    }
+
+    /**
+     * Creates an error object with the default HTTP Error Code (Status.INTERNAL_SERVER_ERROR)
+     *
+     * @param disposition the disposition
+     * @param category the category
+     * @param severity the severity
+     * @param httpResponseCode the http response code
+     * @param restErrorCode the rest error code
+     * @param errorCode the error code
+     * @param errorText the error text
+     */
+    public ErrorObject(String disposition, String category, String severity, Integer httpResponseCode,
+            String restErrorCode, String errorCode, String errorText) {
+        super();
+        this.setDisposition(disposition);
+        this.setCategory(category);
+        this.severity = severity;
+        this.setHTTPResponseCode(httpResponseCode);
+        this.setRESTErrorCode(restErrorCode);
+        this.setErrorCode(errorCode);
+        this.setErrorText(errorText);
+    }
+
+    // OLD STARTS HERE
+
+    /**
+     * Instantiates a new error object.
+     *
+     * @param severity the severity
+     * @param errorCode the error code
+     * @param errorText the error text
+     * @param disposition the disposition
+     * @param category the category
+     */
+    public ErrorObject(String severity, String errorCode, String errorText, String disposition, String category) {
+        this(severity, Status.INTERNAL_SERVER_ERROR, errorCode, errorText, disposition, category);
+    }
+
+    /**
+     * Instantiates a new error object.
+     *
+     * @param severity the severity
+     * @param httpResponseCode the http response code
+     * @param errorCode the error code
+     * @param errorText the error text
+     * @param disposition the disposition
+     * @param category the category
+     */
+    public ErrorObject(String severity, Integer httpResponseCode, String errorCode, String errorText,
+            String disposition, String category) {
+        super();
+        this.severity = severity;
+        this.setHTTPResponseCode(httpResponseCode);
+        this.setErrorCode(errorCode);
+        this.setErrorText(errorText);
+        this.setDisposition(disposition);
+        this.setCategory(category);
+    }
+
+    /**
+     * Instantiates a new error object.
+     *
+     * @param severity the severity
+     * @param httpResponseCode the http response code
+     * @param errorCode the error code
+     * @param errorText the error text
+     * @param disposition the disposition
+     * @param category the category
+     */
+    public ErrorObject(String severity, Status httpResponseCode, String errorCode, String errorText, String disposition,
+            String category) {
+        super();
+        this.severity = severity;
+        this.setHTTPResponseCode(httpResponseCode);
+        this.setErrorCode(errorCode);
+        this.setErrorText(errorText);
+        this.setDisposition(disposition);
+        this.setCategory(category);
+    }
+
+    /**
+     * Gets the disposition.
+     *
+     * @return the disposition
+     */
+    public String getDisposition() {
+        return disposition;
+    }
+
+    /**
+     * Sets the disposition.
+     *
+     * @param disposition the new disposition
+     */
+    public void setDisposition(String disposition) {
+        this.disposition = disposition;
+    }
+
+    /**
+     * Gets the category.
+     *
+     * @return the category
+     */
+    public String getCategory() {
+        return category;
+    }
+
+    /**
+     * Sets the category.
+     *
+     * @param category the new category
+     */
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    /**
+     * Gets the severity.
+     *
+     * @return the severity
+     */
+    public String getSeverity() {
+        return severity;
+    }
+
+    /**
+     * Sets the severity.
+     *
+     * @param severity the new severity
+     */
+    public void setSeverity(String severity) {
+        this.severity = severity;
+    }
+
+    /**
+     * Gets the error code.
+     *
+     * @return the error code
+     */
+    public String getErrorCode() {
+        return errorCode;
+    }
+
+    /**
+     * Sets the error code.
+     *
+     * @param errorCode the new error code
+     */
+    public void setErrorCode(String errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    /**
+     * Gets the HTTP response code.
+     *
+     * @return the HTTP response code
+     */
+    public Status getHTTPResponseCode() {
+        return httpResponseCode;
+    }
+
+    /**
+     * Sets the HTTP response code.
+     *
+     * @param httpResponseCode the new HTTP response code
+     */
+    public void setHTTPResponseCode(Integer httpResponseCode) {
+        this.httpResponseCode = Status.fromStatusCode(httpResponseCode);
+        if (this.httpResponseCode == null) {
+            throw new IllegalArgumentException(
+                    "setHTTPResponseCode was passed an invalid Integer value, fix error.properties or your code "
+                            + httpResponseCode);
+        }
+    }
+
+    /**
+     * Sets the HTTP response code.
+     *
+     * @param httpResponseCode the new HTTP response code
+     */
+    public void setHTTPResponseCode(String httpResponseCode) {
+        this.httpResponseCode = Status.fromStatusCode(Integer.valueOf(httpResponseCode));
+        if (this.httpResponseCode == null) {
+            throw new IllegalArgumentException(
+                    "setHTTPResponseCode was passed an invalid String value, fix error.properties or your code "
+                            + httpResponseCode);
+        }
+    }
+
+    /**
+     * Sets the REST error code.
+     *
+     * @param restErrorCode the new REST error code
+     */
+    public void setRESTErrorCode(String restErrorCode) {
+        this.restErrorCode = restErrorCode;
+    }
+
+    /**
+     * Gets the REST error code.
+     *
+     * @return the REST error code
+     */
+    public String getRESTErrorCode() {
+        return this.restErrorCode;
+    }
+
+    /**
+     * Sets the HTTP response code.
+     *
+     * @param httpResponseCode the new HTTP response code
+     */
+    public void setHTTPResponseCode(Status httpResponseCode) {
+        this.httpResponseCode = httpResponseCode;
+        if (this.httpResponseCode == null) {
+            throw new IllegalArgumentException(
+                    "setHTTPResponseCode was passed an invalid String value, fix error.properties or your code "
+                            + httpResponseCode);
+        }
+    }
+
+    /**
+     * Gets the error text.
+     *
+     * @return the error text
+     */
+    public String getErrorText() {
+        return errorText;
+    }
+
+    /**
+     * Sets the error text.
+     *
+     * @param errorText the new error text
+     */
+    public void setErrorText(String errorText) {
+        this.errorText = errorText;
+    }
+
+    /**
+     * Gets the details.
+     *
+     * @return the details
+     */
+    public String getDetails() {
+        return details;
+    }
+
+    /**
+     * Sets the details.
+     *
+     * @param details the new details
+     */
+    public void setDetails(String details) {
+        this.details = details == null ? "" : details;
+    }
+
+    /**
+     * Gets the error code string. This is also the string
+     * configured in Nagios to alert on
+     *
+     * @return the error code string
+     */
+    // Get the X.Y.Z representation of the error code
+    public String getErrorCodeString() {
+        String prefix = null;
+        switch (disposition) {
+            default:
+                prefix = "";
+                break;
+            case "5":
+                prefix = "ERR.";
+                break;
+        }
+        return prefix + disposition + "." + category + "." + errorCode;
+    }
+
+    /**
+     * Gets the severity Code. This is also the string
+     * configured in Nagios to alert on
+     *
+     * @return the severity
+     */
+    // Get the numerical value of severity
+    public String getSeverityCode(String severity) {
+        String severityCode = "";
+        switch (severity) {
+            case "WARN":
+                severityCode = "1";
+                break;
+            case "ERROR":
+                severityCode = "2";
+                break;
+            case "FATAL":
+                severityCode = "3";
+                break;
+        }
+        return severityCode;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "ErrorObject [errorCode=" + errorCode + ", errorText=" + errorText + ", restErrorCode=" + restErrorCode
+                + ", httpResponseCode=" + httpResponseCode + ", severity=" + severity + ", disposition=" + disposition
+                + ", category=" + category + "]";
+    }
+
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectFormatException.java b/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectFormatException.java
index f9a640b5..8d53f2e3 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectFormatException.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectFormatException.java
@@ -17,13 +17,14 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 public class ErrorObjectFormatException extends Exception {
 
-	private static final long serialVersionUID = 3732705544448553685L;
+    private static final long serialVersionUID = 3732705544448553685L;
 
-	public ErrorObjectFormatException() {
-		super();
-	}
+    public ErrorObjectFormatException() {
+        super();
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectNotFoundException.java b/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectNotFoundException.java
index b279d6b8..3daf7137 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectNotFoundException.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/ErrorObjectNotFoundException.java
@@ -17,34 +17,35 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 public class ErrorObjectNotFoundException extends Exception {
 
-	private static final long serialVersionUID = 4115316781400786740L;
-
-	public ErrorObjectNotFoundException() {
-		// TODO Auto-generated constructor stub
-	}
-	
-	public ErrorObjectNotFoundException(String message) {
-		super(message);
-		// TODO Auto-generated constructor stub
-	}
-	
-	public ErrorObjectNotFoundException(Throwable cause) {
-		super(cause);
-		// TODO Auto-generated constructor stub
-	}
-	
-	public ErrorObjectNotFoundException(String message, Throwable cause) {
-		super(message, cause);
-		// TODO Auto-generated constructor stub
-	}
-	
-	public ErrorObjectNotFoundException(String message, Throwable cause, boolean enableSuppression,
-			boolean writableStackTrace) {
-		super(message, cause, enableSuppression, writableStackTrace);
-		// TODO Auto-generated constructor stub
-	}
+    private static final long serialVersionUID = 4115316781400786740L;
+
+    public ErrorObjectNotFoundException() {
+        // TODO Auto-generated constructor stub
+    }
+
+    public ErrorObjectNotFoundException(String message) {
+        super(message);
+        // TODO Auto-generated constructor stub
+    }
+
+    public ErrorObjectNotFoundException(Throwable cause) {
+        super(cause);
+        // TODO Auto-generated constructor stub
+    }
+
+    public ErrorObjectNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+        // TODO Auto-generated constructor stub
+    }
+
+    public ErrorObjectNotFoundException(String message, Throwable cause, boolean enableSuppression,
+            boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+        // TODO Auto-generated constructor stub
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/LogFormatTools.java b/aai-core/src/main/java/org/onap/aai/logging/LogFormatTools.java
index d91ba19d..804801f1 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/LogFormatTools.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/LogFormatTools.java
@@ -17,107 +17,107 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import java.time.Instant;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.util.AAIConfig;
 import org.onap.aai.util.AAIConstants;
-import org.onap.aai.exceptions.AAIException;
-import org.apache.commons.lang.exception.ExceptionUtils;
 
 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);
+    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());
+    }
 
-	public static String getCurrentDateTime() {
-		return DTF.format(ZonedDateTime.now());
-	}
+    public static String toDate(long timestamp) {
+        return DTF.format(Instant.ofEpochMilli(timestamp));
+    }
 
-	public static String toDate(long timestamp) {
-		return DTF.format(Instant.ofEpochMilli(timestamp));
-	}
+    public static long toTimestamp(String date) {
+        return ZonedDateTime.parse(date, DTF).toInstant().toEpochMilli();
+    }
 
-	public static long toTimestamp(String date) {
-		return ZonedDateTime.parse(date, DTF).toInstant().toEpochMilli();
-	}
-	/**
-	 * Gets the stack top.
-	 *
-	 * @param e the e
-	 * @return the stack top
-	 * @throws NumberFormatException the number format exception
-	 * @throws AAIException the AAI exception
-	 */
-	public static String getStackTop(Throwable e) {
-	    // StringBuilder is more efficient than StringBuffer and should only
-		// StringBuffer is only supposed to be used if multiple threads are modifying
-		// the same object and since this object is created locally not necessary
-		StringBuilder stackMessage = new StringBuilder();
-		int maxStackTraceEntries = 10;
-		try {
-			maxStackTraceEntries = Integer.valueOf(AAIConfig.get(AAIConstants.LOGGING_MAX_STACK_TRACE_ENTRIES));
-		}
-		catch (AAIException a) {
-			//ignore, use default
-		}
-		catch (NumberFormatException n) {
-			//ignore, use default
-		}
-		if (e != null) {
-			Throwable rootCause = ExceptionUtils.getRootCause(e);
-			if (rootCause != null) {
-				stackMessage.append("root cause=" + ExceptionUtils.getRootCause(e));
-				StackTraceElement[] elements = rootCause.getStackTrace();
-				int i = 0;
-				for (StackTraceElement element : elements) {
-					if (i < maxStackTraceEntries) {
-						stackMessage.append(" ClassName- ");
-						stackMessage.append(element.getClassName());
-						stackMessage.append(" :LineNumber- ");
-						stackMessage.append(element.getLineNumber());
-						stackMessage.append(" :MethodName- ");
-						stackMessage.append(element.getMethodName());
-					}
-					i++;
-				}
-			} else if (e.getCause() != null) {
-				stackMessage.append("cause=" + e.getCause());
-				StackTraceElement[] elements = e.getCause().getStackTrace();
-				int i = 0;
-				for (StackTraceElement element : elements) {
-					if (i < maxStackTraceEntries) {
-						stackMessage.append(" ClassName- ");
-						stackMessage.append(element.getClassName());
-						stackMessage.append(" :LineNumber- ");
-						stackMessage.append(element.getLineNumber());
-						stackMessage.append(" :MethodName- ");
-						stackMessage.append(element.getMethodName());
-					}
-					i++;
-				}
-			} else if (e.getStackTrace() != null) {
-				stackMessage.append("ex=" + e.toString());
-				StackTraceElement[] elements = e.getStackTrace();
-				int i = 0;
-				for (StackTraceElement element : elements) {
-					if (i < maxStackTraceEntries) {
-						stackMessage.append(" ClassName- ");
-						stackMessage.append(element.getClassName());
-						stackMessage.append(" :LineNumber- ");
-						stackMessage.append(element.getLineNumber());
-						stackMessage.append(" :MethodName- ");
-						stackMessage.append(element.getMethodName());
-					}
-					i++;
-				}
-			}
-		}
-		return stackMessage.toString();
-	}
+    /**
+     * Gets the stack top.
+     *
+     * @param e the e
+     * @return the stack top
+     * @throws NumberFormatException the number format exception
+     * @throws AAIException the AAI exception
+     */
+    public static String getStackTop(Throwable e) {
+        // StringBuilder is more efficient than StringBuffer and should only
+        // StringBuffer is only supposed to be used if multiple threads are modifying
+        // the same object and since this object is created locally not necessary
+        StringBuilder stackMessage = new StringBuilder();
+        int maxStackTraceEntries = 10;
+        try {
+            maxStackTraceEntries = Integer.valueOf(AAIConfig.get(AAIConstants.LOGGING_MAX_STACK_TRACE_ENTRIES));
+        } catch (AAIException a) {
+            // ignore, use default
+        } catch (NumberFormatException n) {
+            // ignore, use default
+        }
+        if (e != null) {
+            Throwable rootCause = ExceptionUtils.getRootCause(e);
+            if (rootCause != null) {
+                stackMessage.append("root cause=" + ExceptionUtils.getRootCause(e));
+                StackTraceElement[] elements = rootCause.getStackTrace();
+                int i = 0;
+                for (StackTraceElement element : elements) {
+                    if (i < maxStackTraceEntries) {
+                        stackMessage.append(" ClassName- ");
+                        stackMessage.append(element.getClassName());
+                        stackMessage.append(" :LineNumber- ");
+                        stackMessage.append(element.getLineNumber());
+                        stackMessage.append(" :MethodName- ");
+                        stackMessage.append(element.getMethodName());
+                    }
+                    i++;
+                }
+            } else if (e.getCause() != null) {
+                stackMessage.append("cause=" + e.getCause());
+                StackTraceElement[] elements = e.getCause().getStackTrace();
+                int i = 0;
+                for (StackTraceElement element : elements) {
+                    if (i < maxStackTraceEntries) {
+                        stackMessage.append(" ClassName- ");
+                        stackMessage.append(element.getClassName());
+                        stackMessage.append(" :LineNumber- ");
+                        stackMessage.append(element.getLineNumber());
+                        stackMessage.append(" :MethodName- ");
+                        stackMessage.append(element.getMethodName());
+                    }
+                    i++;
+                }
+            } else if (e.getStackTrace() != null) {
+                stackMessage.append("ex=" + e.toString());
+                StackTraceElement[] elements = e.getStackTrace();
+                int i = 0;
+                for (StackTraceElement element : elements) {
+                    if (i < maxStackTraceEntries) {
+                        stackMessage.append(" ClassName- ");
+                        stackMessage.append(element.getClassName());
+                        stackMessage.append(" :LineNumber- ");
+                        stackMessage.append(element.getLineNumber());
+                        stackMessage.append(" :MethodName- ");
+                        stackMessage.append(element.getMethodName());
+                    }
+                    i++;
+                }
+            }
+        }
+        return stackMessage.toString();
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/LoggingContext.java b/aai-core/src/main/java/org/onap/aai/logging/LoggingContext.java
index 50af1c68..f79025a2 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/LoggingContext.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/LoggingContext.java
@@ -17,8 +17,12 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.HashMap;
@@ -33,394 +37,384 @@ import org.json.JSONObject;
 import org.onap.aai.exceptions.AAIException;
 import org.slf4j.MDC;
 
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
 public class LoggingContext {
 
-	public enum StatusCode {
-		COMPLETE,
-		ERROR
-	}
-
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(LoggingContext.class);
-
-	private static final String PREVIOUS_CONTEXTS_KEY = "_PREVIOUS_CONTEXTS";
-	
-	//Response codes from Logging Guidelines
-	public static final String SUCCESS = "0";
-	public static final String PERMISSION_ERROR = "100";
-	public static final String AVAILABILITY_TIMEOUT_ERROR = "200";
-	public static final String DATA_ERROR = "300";
-	public static final String SCHEMA_ERROR = "400";
-	public static final String BUSINESS_PROCESS_ERROR = "500";
-	public static final String UNKNOWN_ERROR = "900";
-	
-	public static final Map responseMap = new HashMap();
-	 
+    public enum StatusCode {
+        COMPLETE, ERROR
+    }
+
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(LoggingContext.class);
+
+    private static final String PREVIOUS_CONTEXTS_KEY = "_PREVIOUS_CONTEXTS";
+
+    // Response codes from Logging Guidelines
+    public static final String SUCCESS = "0";
+    public static final String PERMISSION_ERROR = "100";
+    public static final String AVAILABILITY_TIMEOUT_ERROR = "200";
+    public static final String DATA_ERROR = "300";
+    public static final String SCHEMA_ERROR = "400";
+    public static final String BUSINESS_PROCESS_ERROR = "500";
+    public static final String UNKNOWN_ERROR = "900";
+
+    public static final Map responseMap = new HashMap();
+
     static {
         responseMap.put(SUCCESS, "Success");
         responseMap.put(UNKNOWN_ERROR, "Unknown error");
     }
-	// Specific Log Event Fields
-	public static enum LoggingField {
-		START_TIME("startTime"),
-		REQUEST_ID("requestId"),
-		SERVICE_INSTANCE_ID("serviceInstanceId"),
-		SERVER_NAME("serverName"),
-		SERVICE_NAME("serviceName"),
-		PARTNER_NAME("partnerName"),
-		STATUS_CODE("statusCode"),
-		RESPONSE_CODE("responseCode"),
-		RESPONSE_DESCRIPTION("responseDescription"),
-		INSTANCE_UUID("instanceUUID"),
-		SEVERITY("severity"),
-		SERVER_IP_ADDRESS("serverIpAddress"),
-		ELAPSED_TIME("elapsedTime"),
-		SERVER("server"),
-		CLIENT_IP_ADDRESS("clientIpAddress"),
-		UNUSED("unused"),
-		PROCESS_KEY("processKey"),
-		CUSTOM_FIELD_1("customField1"),
-		CUSTOM_FIELD_2("customField2"),
-		CUSTOM_FIELD_3("customField3"),
-		CUSTOM_FIELD_4("customField4"),
-		
-		// Specific Metric Log Event Fields
-		TARGET_ENTITY("targetEntity"),
-		TARGET_SERVICE_NAME("targetServiceName"),
-		//A&AI Specific Log Event Fields
-		COMPONENT("component"),
-		STOP_WATCH_START("stopWatchStart");
-
-		private final String text;
-
-		private LoggingField(final String text) {
-			this.text = text;
-		}
-
-		public String toString() {
-			return text;
-		}
-	}
-
-
-	public static void init() {
-		LoggingContext.clear();
-		LoggingContext.startTime();
-		LoggingContext.server();
-		LoggingContext.serverIpAddress();
-	}
-
-	public static void startTime() {
-		MDC.put(LoggingField.START_TIME.toString(), LogFormatTools.getCurrentDateTime());
-	}
-
-	public static UUID requestId() {
-		final String sUuid = MDC.get(LoggingField.REQUEST_ID.toString());
-
-		if (sUuid == null) return null;
-
-		return UUID.fromString(sUuid);
-	}
-
-	public static void requestId(UUID requestId) {
-		MDC.put(LoggingField.REQUEST_ID.toString(), requestId.toString());
-	}
-
-	public static void requestId(String requestId) {
-		try {
-			if (requestId.contains(":")) {
-				String[] uuidParts = requestId.split(":");
-				requestId = uuidParts[0];
-			}
-			MDC.put(LoggingField.REQUEST_ID.toString(), UUID.fromString(requestId).toString());
-		} catch (IllegalArgumentException e) {
-			final UUID generatedRequestUuid = UUID.randomUUID();
-			MDC.put(LoggingField.REQUEST_ID.toString(), generatedRequestUuid.toString());
-			LoggingContext.save();
-			// set response code to 0 since we don't know what the outcome of this request is yet
-			String responseCode = LoggingContext.DATA_ERROR;
-			LoggingContext.responseCode(responseCode);
-			LoggingContext.responseDescription("Unable to use UUID " + requestId + " (Not formatted properly) ");
-			LoggingContext.statusCode(StatusCode.ERROR);
-			
-			LOGGER.warn("Using generated UUID=" + generatedRequestUuid);
-			LoggingContext.restore();
-
-		}
-	}
-
-	public static void serviceInstanceId(String serviceInstanceId) {
-		MDC.put(LoggingField.SERVICE_INSTANCE_ID.toString(), serviceInstanceId);
-	}
-
-	public static void serverName(String serverName) {
-		MDC.put(LoggingField.SERVER_NAME.toString(), serverName);
-	}
-
-	public static void serviceName(String serviceName) {
-		MDC.put(LoggingField.SERVICE_NAME.toString(), serviceName);
-	}
-
-	public static void partnerName(String partnerName) {
-		MDC.put(LoggingField.PARTNER_NAME.toString(), partnerName);
-	}
-
-	public static void statusCode(StatusCode statusCode) {
-		MDC.put(LoggingField.STATUS_CODE.toString(), statusCode.toString());
-	}
-
-	public static String responseCode() {
-		return (String) MDC.get(LoggingField.RESPONSE_CODE.toString());
-	}
-
-	public static void responseCode(String responseCode) {
-		MDC.put(LoggingField.RESPONSE_CODE.toString(), responseCode);
-	}
-
-	public static void responseDescription(String responseDescription) {
-		MDC.put(LoggingField.RESPONSE_DESCRIPTION.toString(), responseDescription);
-	}
-
-	public static Object instanceUuid() {
-		return UUID.fromString(MDC.get(LoggingField.INSTANCE_UUID.toString()));
-	}
-
-	public static void instanceUuid(UUID instanceUuid) {
-		MDC.put(LoggingField.INSTANCE_UUID.toString(), instanceUuid.toString());
-	}
-
-	public static void severity(int severity) {
-		MDC.put(LoggingField.SEVERITY.toString(), String.valueOf(severity));
-	}
-
-	public static void successStatusFields() {
-		responseCode(SUCCESS);
-		statusCode(StatusCode.COMPLETE);
-		responseDescription("Success");
-	}
-	private static void serverIpAddress() {
-		try {
-			MDC.put(LoggingField.SERVER_IP_ADDRESS.toString(), InetAddress.getLocalHost().getHostAddress());
-		} catch (UnknownHostException e) {
-			LOGGER.warn("Unable to resolve server IP address - will not be displayed in logged events");
-		}
-	}
-
-	public static void elapsedTime(long elapsedTime, TimeUnit timeUnit) {
-		MDC.put(LoggingField.ELAPSED_TIME.toString(), String.valueOf(TimeUnit.MILLISECONDS.convert(elapsedTime, timeUnit)));
-	}
-
-	private static void server() {
-		try {
-			MDC.put(LoggingField.SERVER.toString(),  InetAddress.getLocalHost().getCanonicalHostName());
-		} catch (UnknownHostException e) {
-			LOGGER.warn("Unable to resolve server IP address - hostname will not be displayed in logged events");
-		}
-	}
-
-	public static void clientIpAddress(InetAddress clientIpAddress) {
-		MDC.put(LoggingField.CLIENT_IP_ADDRESS.toString(), clientIpAddress.getHostAddress());
-	}
-
-	public static void clientIpAddress(String clientIpAddress) {
-		try {
-			MDC.put(LoggingField.CLIENT_IP_ADDRESS.toString(), InetAddress.getByName(clientIpAddress).getHostAddress());
-		} catch (UnknownHostException e) {
-			//Ignore, will not be thrown since InetAddress.getByName(String) only
-			//checks the validity of the passed in string
-		}
-	}
-
-	public static void unused(String unused) {
-		LOGGER.warn("Using field '" + LoggingField.UNUSED + "' (seems like this should go unused...)");
-		MDC.put(LoggingField.UNUSED.toString(), unused);
-	}
-
-	public static void processKey(String processKey) {
-		MDC.put(LoggingField.PROCESS_KEY.toString(), processKey);
-	}
-
-	public static String customField1() {
-		return MDC.get(LoggingField.CUSTOM_FIELD_1.toString());
-	}
-
-	public static void customField1(String customField1) {
-		MDC.put(LoggingField.CUSTOM_FIELD_1.toString(), customField1);
-	}
-
-	public static void customField2(String customField2) {
-		MDC.put(LoggingField.CUSTOM_FIELD_2.toString(), customField2);
-	}
-
-	public static void customField3(String customField3) {
-		MDC.put(LoggingField.CUSTOM_FIELD_3.toString(), customField3);
-	}
-
-	public static void customField4(String customField4) {
-		MDC.put(LoggingField.CUSTOM_FIELD_4.toString(), customField4);
-	}
-
-	public static void component(String component) {
-		MDC.put(LoggingField.COMPONENT.toString(), component);
-	}
-
-	public static void targetEntity(String targetEntity) {
-		MDC.put(LoggingField.TARGET_ENTITY.toString(), targetEntity);
-	}
-
-	public static void targetServiceName(String targetServiceName) {
-		MDC.put(LoggingField.TARGET_SERVICE_NAME.toString(), targetServiceName);
-	}
-
-	public static boolean isStopWatchStarted() {
-		final String rawStopWatchStart = MDC.get(LoggingField.STOP_WATCH_START.toString());
-		if (rawStopWatchStart == null) {
-			return false;
-		}
-		return true;
-	}
-	public static void stopWatchStart() {
-		MDC.put(LoggingField.STOP_WATCH_START.toString(), String.valueOf(System.nanoTime()));
-	}
-
-	public static double stopWatchStop() {
-		final long stopWatchEnd = System.nanoTime();
-		final String rawStopWatchStart = MDC.get(LoggingField.STOP_WATCH_START.toString());
-
-		if (rawStopWatchStart == null) throw new StopWatchNotStartedException();
-
-		final Long stopWatchStart = Long.valueOf(rawStopWatchStart);
-
-		MDC.remove(LoggingField.STOP_WATCH_START.toString());
-
-		final double elapsedTimeMillis = (stopWatchEnd - stopWatchStart) / 1000.0 / 1000.0;
-
-		LoggingContext.elapsedTime((long) elapsedTimeMillis, TimeUnit.MILLISECONDS);
-
-		return elapsedTimeMillis;
-	}
-
-	public static void put(String key, String value) {
-		MDC.put(key, value);
-	}
-
-	public static void clear() {
-		MDC.clear();
-	}
-
-	public static void remove(String key) {
-		MDC.remove(key);
-	}
-
-	public static void save() {
-		final JSONObject context = new JSONObject();
-
-		for (LoggingField field : LoggingField.values()) {
-			if (field == LoggingField.ELAPSED_TIME) continue;
-
-			try {
-				context.put(field.toString(), MDC.get(field.toString()));
-			} catch (JSONException e) {
-				//Ignore - only occurs when the key is null (which can't happen)
-				//			or the value is invalid (everything is converted to a string
-				//			before it get put() to the MDC)
-			}
-		}
-
-		final String rawJsonArray = MDC.get(PREVIOUS_CONTEXTS_KEY);
-
-		if (rawJsonArray == null) {
-			final JSONArray stack = new JSONArray()
-											.put(context);
-
-			MDC.put(PREVIOUS_CONTEXTS_KEY, stack.toString());
-		} else {
-			try {
-				final JSONArray stack = new JSONArray(rawJsonArray)
-												.put(context);
-
-				MDC.put(PREVIOUS_CONTEXTS_KEY, stack.toString());
-			} catch (JSONException e) {
-				//Ignore
-			}
-		}
-	}
-
-	public static void restore() {
-		
-		final String rawPreviousContexts = MDC.get(PREVIOUS_CONTEXTS_KEY);
-	
-		if (rawPreviousContexts == null) {
-			throw new LoggingContextNotExistsException();
-		}
-
-		try {
-			final JSONArray previousContexts = new JSONArray(rawPreviousContexts);
-			final JSONObject previousContext = previousContexts.getJSONObject(previousContexts.length() - 1);
-
-			@SuppressWarnings("unchecked")
-			final Iterator keys = previousContext.keys();
-			boolean foundElapsedTime = false;
-			while (keys.hasNext()) {
-				final String key = keys.next();
-				if (LoggingField.ELAPSED_TIME.toString().equals(key)) {
-					foundElapsedTime = true;
-				}
-				try {
-					MDC.put(key, previousContext.getString(key));
-				} catch (JSONException e) {
-					//Ignore, only occurs when the key is null (cannot happen)
-					//			or the value is invalid (they are all strings)
-				}
-			}
-			if ( !foundElapsedTime ) {
-				MDC.remove(LoggingField.ELAPSED_TIME.toString());
-			}
-			MDC.put(PREVIOUS_CONTEXTS_KEY, removeLast(previousContexts).toString());
-		} catch (JSONException e) {
-			//Ignore, the previousContext is serialized from a JSONObject
-		}
-	}
-	public static void restoreIfPossible() {
-		try {
-			restore();
-		}
-		catch (LoggingContextNotExistsException e) {
-			//Ignore
-		}
-	}
-
-	/**
-	 * AJSC declares an ancient version of org.json:json in one of the parent POMs of this project.
-	 * I tried to update our version of that library in our POM, but it's ignored because of the way
-	 * AJSC has organized their .  Had they put it into the  section,
-	 * this method would not be necessary.
-	 */
-	private static JSONArray removeLast(JSONArray previousContexts) {
-		final JSONArray result = new JSONArray();
-
-		for (int i = 0; i < previousContexts.length() - 1; i++) {
-			try {
-				result.put(previousContexts.getJSONObject(i));
-			} catch (JSONException e) {
-				//Ignore - not possible
-			}
-		}
-
-		return result;
-	}
-
-	public static Map getCopy() {
-		final Map copy = new HashMap ();
-
-		for (LoggingField field : LoggingField.values()) {
-			final String value = MDC.get(field.toString());
-
-			if (value != null) copy.put(field.toString(), value);
-		}
-
-		return copy;
-	}
+
+    // Specific Log Event Fields
+    public static enum LoggingField {
+        START_TIME("startTime"), REQUEST_ID("requestId"), SERVICE_INSTANCE_ID("serviceInstanceId"), SERVER_NAME(
+                "serverName"), SERVICE_NAME("serviceName"), PARTNER_NAME("partnerName"), STATUS_CODE(
+                        "statusCode"), RESPONSE_CODE("responseCode"), RESPONSE_DESCRIPTION(
+                                "responseDescription"), INSTANCE_UUID("instanceUUID"), SEVERITY(
+                                        "severity"), SERVER_IP_ADDRESS(
+                                                "serverIpAddress"), ELAPSED_TIME("elapsedTime"), SERVER(
+                                                        "server"), CLIENT_IP_ADDRESS("clientIpAddress"), UNUSED(
+                                                                "unused"), PROCESS_KEY("processKey"), CUSTOM_FIELD_1(
+                                                                        "customField1"), CUSTOM_FIELD_2(
+                                                                                "customField2"), CUSTOM_FIELD_3(
+                                                                                        "customField3"), CUSTOM_FIELD_4(
+                                                                                                "customField4"),
+
+        // Specific Metric Log Event Fields
+        TARGET_ENTITY("targetEntity"), TARGET_SERVICE_NAME("targetServiceName"),
+        // A&AI Specific Log Event Fields
+        COMPONENT("component"), STOP_WATCH_START("stopWatchStart");
+
+        private final String text;
+
+        private LoggingField(final String text) {
+            this.text = text;
+        }
+
+        public String toString() {
+            return text;
+        }
+    }
+
+    public static void init() {
+        LoggingContext.clear();
+        LoggingContext.startTime();
+        LoggingContext.server();
+        LoggingContext.serverIpAddress();
+    }
+
+    public static void startTime() {
+        MDC.put(LoggingField.START_TIME.toString(), LogFormatTools.getCurrentDateTime());
+    }
+
+    public static UUID requestId() {
+        final String sUuid = MDC.get(LoggingField.REQUEST_ID.toString());
+
+        if (sUuid == null)
+            return null;
+
+        return UUID.fromString(sUuid);
+    }
+
+    public static void requestId(UUID requestId) {
+        MDC.put(LoggingField.REQUEST_ID.toString(), requestId.toString());
+    }
+
+    public static void requestId(String requestId) {
+        try {
+            if (requestId.contains(":")) {
+                String[] uuidParts = requestId.split(":");
+                requestId = uuidParts[0];
+            }
+            MDC.put(LoggingField.REQUEST_ID.toString(), UUID.fromString(requestId).toString());
+        } catch (IllegalArgumentException e) {
+            final UUID generatedRequestUuid = UUID.randomUUID();
+            MDC.put(LoggingField.REQUEST_ID.toString(), generatedRequestUuid.toString());
+            LoggingContext.save();
+            // set response code to 0 since we don't know what the outcome of this request is yet
+            String responseCode = LoggingContext.DATA_ERROR;
+            LoggingContext.responseCode(responseCode);
+            LoggingContext.responseDescription("Unable to use UUID " + requestId + " (Not formatted properly) ");
+            LoggingContext.statusCode(StatusCode.ERROR);
+
+            LOGGER.warn("Using generated UUID=" + generatedRequestUuid);
+            LoggingContext.restore();
+
+        }
+    }
+
+    public static void serviceInstanceId(String serviceInstanceId) {
+        MDC.put(LoggingField.SERVICE_INSTANCE_ID.toString(), serviceInstanceId);
+    }
+
+    public static void serverName(String serverName) {
+        MDC.put(LoggingField.SERVER_NAME.toString(), serverName);
+    }
+
+    public static void serviceName(String serviceName) {
+        MDC.put(LoggingField.SERVICE_NAME.toString(), serviceName);
+    }
+
+    public static void partnerName(String partnerName) {
+        MDC.put(LoggingField.PARTNER_NAME.toString(), partnerName);
+    }
+
+    public static void statusCode(StatusCode statusCode) {
+        MDC.put(LoggingField.STATUS_CODE.toString(), statusCode.toString());
+    }
+
+    public static String responseCode() {
+        return (String) MDC.get(LoggingField.RESPONSE_CODE.toString());
+    }
+
+    public static void responseCode(String responseCode) {
+        MDC.put(LoggingField.RESPONSE_CODE.toString(), responseCode);
+    }
+
+    public static void responseDescription(String responseDescription) {
+        MDC.put(LoggingField.RESPONSE_DESCRIPTION.toString(), responseDescription);
+    }
+
+    public static Object instanceUuid() {
+        return UUID.fromString(MDC.get(LoggingField.INSTANCE_UUID.toString()));
+    }
+
+    public static void instanceUuid(UUID instanceUuid) {
+        MDC.put(LoggingField.INSTANCE_UUID.toString(), instanceUuid.toString());
+    }
+
+    public static void severity(int severity) {
+        MDC.put(LoggingField.SEVERITY.toString(), String.valueOf(severity));
+    }
+
+    public static void successStatusFields() {
+        responseCode(SUCCESS);
+        statusCode(StatusCode.COMPLETE);
+        responseDescription("Success");
+    }
+
+    private static void serverIpAddress() {
+        try {
+            MDC.put(LoggingField.SERVER_IP_ADDRESS.toString(), InetAddress.getLocalHost().getHostAddress());
+        } catch (UnknownHostException e) {
+            LOGGER.warn("Unable to resolve server IP address - will not be displayed in logged events");
+        }
+    }
+
+    public static void elapsedTime(long elapsedTime, TimeUnit timeUnit) {
+        MDC.put(LoggingField.ELAPSED_TIME.toString(),
+                String.valueOf(TimeUnit.MILLISECONDS.convert(elapsedTime, timeUnit)));
+    }
+
+    private static void server() {
+        try {
+            MDC.put(LoggingField.SERVER.toString(), InetAddress.getLocalHost().getCanonicalHostName());
+        } catch (UnknownHostException e) {
+            LOGGER.warn("Unable to resolve server IP address - hostname will not be displayed in logged events");
+        }
+    }
+
+    public static void clientIpAddress(InetAddress clientIpAddress) {
+        MDC.put(LoggingField.CLIENT_IP_ADDRESS.toString(), clientIpAddress.getHostAddress());
+    }
+
+    public static void clientIpAddress(String clientIpAddress) {
+        try {
+            MDC.put(LoggingField.CLIENT_IP_ADDRESS.toString(), InetAddress.getByName(clientIpAddress).getHostAddress());
+        } catch (UnknownHostException e) {
+            // Ignore, will not be thrown since InetAddress.getByName(String) only
+            // checks the validity of the passed in string
+        }
+    }
+
+    public static void unused(String unused) {
+        LOGGER.warn("Using field '" + LoggingField.UNUSED + "' (seems like this should go unused...)");
+        MDC.put(LoggingField.UNUSED.toString(), unused);
+    }
+
+    public static void processKey(String processKey) {
+        MDC.put(LoggingField.PROCESS_KEY.toString(), processKey);
+    }
+
+    public static String customField1() {
+        return MDC.get(LoggingField.CUSTOM_FIELD_1.toString());
+    }
+
+    public static void customField1(String customField1) {
+        MDC.put(LoggingField.CUSTOM_FIELD_1.toString(), customField1);
+    }
+
+    public static void customField2(String customField2) {
+        MDC.put(LoggingField.CUSTOM_FIELD_2.toString(), customField2);
+    }
+
+    public static void customField3(String customField3) {
+        MDC.put(LoggingField.CUSTOM_FIELD_3.toString(), customField3);
+    }
+
+    public static void customField4(String customField4) {
+        MDC.put(LoggingField.CUSTOM_FIELD_4.toString(), customField4);
+    }
+
+    public static void component(String component) {
+        MDC.put(LoggingField.COMPONENT.toString(), component);
+    }
+
+    public static void targetEntity(String targetEntity) {
+        MDC.put(LoggingField.TARGET_ENTITY.toString(), targetEntity);
+    }
+
+    public static void targetServiceName(String targetServiceName) {
+        MDC.put(LoggingField.TARGET_SERVICE_NAME.toString(), targetServiceName);
+    }
+
+    public static boolean isStopWatchStarted() {
+        final String rawStopWatchStart = MDC.get(LoggingField.STOP_WATCH_START.toString());
+        if (rawStopWatchStart == null) {
+            return false;
+        }
+        return true;
+    }
+
+    public static void stopWatchStart() {
+        MDC.put(LoggingField.STOP_WATCH_START.toString(), String.valueOf(System.nanoTime()));
+    }
+
+    public static double stopWatchStop() {
+        final long stopWatchEnd = System.nanoTime();
+        final String rawStopWatchStart = MDC.get(LoggingField.STOP_WATCH_START.toString());
+
+        if (rawStopWatchStart == null)
+            throw new StopWatchNotStartedException();
+
+        final Long stopWatchStart = Long.valueOf(rawStopWatchStart);
+
+        MDC.remove(LoggingField.STOP_WATCH_START.toString());
+
+        final double elapsedTimeMillis = (stopWatchEnd - stopWatchStart) / 1000.0 / 1000.0;
+
+        LoggingContext.elapsedTime((long) elapsedTimeMillis, TimeUnit.MILLISECONDS);
+
+        return elapsedTimeMillis;
+    }
+
+    public static void put(String key, String value) {
+        MDC.put(key, value);
+    }
+
+    public static void clear() {
+        MDC.clear();
+    }
+
+    public static void remove(String key) {
+        MDC.remove(key);
+    }
+
+    public static void save() {
+        final JSONObject context = new JSONObject();
+
+        for (LoggingField field : LoggingField.values()) {
+            if (field == LoggingField.ELAPSED_TIME)
+                continue;
+
+            try {
+                context.put(field.toString(), MDC.get(field.toString()));
+            } catch (JSONException e) {
+                // Ignore - only occurs when the key is null (which can't happen)
+                // or the value is invalid (everything is converted to a string
+                // before it get put() to the MDC)
+            }
+        }
+
+        final String rawJsonArray = MDC.get(PREVIOUS_CONTEXTS_KEY);
+
+        if (rawJsonArray == null) {
+            final JSONArray stack = new JSONArray().put(context);
+
+            MDC.put(PREVIOUS_CONTEXTS_KEY, stack.toString());
+        } else {
+            try {
+                final JSONArray stack = new JSONArray(rawJsonArray).put(context);
+
+                MDC.put(PREVIOUS_CONTEXTS_KEY, stack.toString());
+            } catch (JSONException e) {
+                // Ignore
+            }
+        }
+    }
+
+    public static void restore() {
+
+        final String rawPreviousContexts = MDC.get(PREVIOUS_CONTEXTS_KEY);
+
+        if (rawPreviousContexts == null) {
+            throw new LoggingContextNotExistsException();
+        }
+
+        try {
+            final JSONArray previousContexts = new JSONArray(rawPreviousContexts);
+            final JSONObject previousContext = previousContexts.getJSONObject(previousContexts.length() - 1);
+
+            @SuppressWarnings("unchecked")
+            final Iterator keys = previousContext.keys();
+            boolean foundElapsedTime = false;
+            while (keys.hasNext()) {
+                final String key = keys.next();
+                if (LoggingField.ELAPSED_TIME.toString().equals(key)) {
+                    foundElapsedTime = true;
+                }
+                try {
+                    MDC.put(key, previousContext.getString(key));
+                } catch (JSONException e) {
+                    // Ignore, only occurs when the key is null (cannot happen)
+                    // or the value is invalid (they are all strings)
+                }
+            }
+            if (!foundElapsedTime) {
+                MDC.remove(LoggingField.ELAPSED_TIME.toString());
+            }
+            MDC.put(PREVIOUS_CONTEXTS_KEY, removeLast(previousContexts).toString());
+        } catch (JSONException e) {
+            // Ignore, the previousContext is serialized from a JSONObject
+        }
+    }
+
+    public static void restoreIfPossible() {
+        try {
+            restore();
+        } catch (LoggingContextNotExistsException e) {
+            // Ignore
+        }
+    }
+
+    /**
+     * AJSC declares an ancient version of org.json:json in one of the parent POMs of this project.
+     * I tried to update our version of that library in our POM, but it's ignored because of the way
+     * AJSC has organized their . Had they put it into the  section,
+     * this method would not be necessary.
+     */
+    private static JSONArray removeLast(JSONArray previousContexts) {
+        final JSONArray result = new JSONArray();
+
+        for (int i = 0; i < previousContexts.length() - 1; i++) {
+            try {
+                result.put(previousContexts.getJSONObject(i));
+            } catch (JSONException e) {
+                // Ignore - not possible
+            }
+        }
+
+        return result;
+    }
+
+    public static Map getCopy() {
+        final Map copy = new HashMap();
+
+        for (LoggingField field : LoggingField.values()) {
+            final String value = MDC.get(field.toString());
+
+            if (value != null)
+                copy.put(field.toString(), value);
+        }
+
+        return copy;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/LoggingContextNotExistsException.java b/aai-core/src/main/java/org/onap/aai/logging/LoggingContextNotExistsException.java
index fab59fcc..f1d4c59c 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/LoggingContextNotExistsException.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/LoggingContextNotExistsException.java
@@ -17,9 +17,10 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 public class LoggingContextNotExistsException extends RuntimeException {
 
-	private static final long serialVersionUID = -4965807709525739623L;
+    private static final long serialVersionUID = -4965807709525739623L;
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/StopWatch.java b/aai-core/src/main/java/org/onap/aai/logging/StopWatch.java
index e305062a..0d93827f 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/StopWatch.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/StopWatch.java
@@ -17,35 +17,40 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 import org.onap.aai.logging.LoggingContext.LoggingField;
 
 public final class StopWatch {
 
-	private StopWatch() {}
-
-	public static void start() {
-		LoggingContext.stopWatchStart();
-	}
-
-	public static double stop() {
-		return LoggingContext.stopWatchStop();
-	}
-	public static void conditionalStart() {
-		if ( LoggingContext.isStopWatchStarted() ) {
-			return;
-		}
-		start();
-	}
-	public static double stopIfStarted() {
-		if ( LoggingContext.isStopWatchStarted() ) {
-			return (stop());
-		}
-		return (0);
-	}
-	public static void clear() {
-		LoggingContext.remove(LoggingField.STOP_WATCH_START.toString());
-		LoggingContext.remove(LoggingField.ELAPSED_TIME.toString());
-	}
+    private StopWatch() {
+    }
+
+    public static void start() {
+        LoggingContext.stopWatchStart();
+    }
+
+    public static double stop() {
+        return LoggingContext.stopWatchStop();
+    }
+
+    public static void conditionalStart() {
+        if (LoggingContext.isStopWatchStarted()) {
+            return;
+        }
+        start();
+    }
+
+    public static double stopIfStarted() {
+        if (LoggingContext.isStopWatchStarted()) {
+            return (stop());
+        }
+        return (0);
+    }
+
+    public static void clear() {
+        LoggingContext.remove(LoggingField.STOP_WATCH_START.toString());
+        LoggingContext.remove(LoggingField.ELAPSED_TIME.toString());
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/logging/StopWatchNotStartedException.java b/aai-core/src/main/java/org/onap/aai/logging/StopWatchNotStartedException.java
index b1ee5de6..e4819c5c 100644
--- a/aai-core/src/main/java/org/onap/aai/logging/StopWatchNotStartedException.java
+++ b/aai-core/src/main/java/org/onap/aai/logging/StopWatchNotStartedException.java
@@ -17,25 +17,26 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.logging;
 
 public class StopWatchNotStartedException extends RuntimeException {
 
-	private static final long serialVersionUID = -4540164295822859408L;
+    private static final long serialVersionUID = -4540164295822859408L;
 
-	public StopWatchNotStartedException() {
-		super();
-	}
+    public StopWatchNotStartedException() {
+        super();
+    }
 
-	public StopWatchNotStartedException(String message) {
-		super(message);
-	}
+    public StopWatchNotStartedException(String message) {
+        super(message);
+    }
 
-	public StopWatchNotStartedException(Throwable cause) {
-		super(cause);
-	}
+    public StopWatchNotStartedException(Throwable cause) {
+        super(cause);
+    }
 
-	public StopWatchNotStartedException(String message, Throwable cause) {
-		super(message, cause);
-	}
+    public StopWatchNotStartedException(String message, Throwable cause) {
+        super(message, cause);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AAIIdentityMapParseException.java b/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AAIIdentityMapParseException.java
index 4693840e..b09165ea 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AAIIdentityMapParseException.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AAIIdentityMapParseException.java
@@ -17,24 +17,25 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class AAIIdentityMapParseException extends AAIException {
 
-	private static final long serialVersionUID = -888876613879411865L;
-	
-	public AAIIdentityMapParseException(String message) {
-		super("AAI_3000", message);
-	}
+    private static final long serialVersionUID = -888876613879411865L;
+
+    public AAIIdentityMapParseException(String message) {
+        super("AAI_3000", message);
+    }
 
-	public AAIIdentityMapParseException(Throwable cause) {
-		super("AAI_3000",cause);
-	}
+    public AAIIdentityMapParseException(Throwable cause) {
+        super("AAI_3000", cause);
+    }
 
-	public AAIIdentityMapParseException(String message, Throwable cause) {
-		super("AAI_3000", cause, message);
-	}
+    public AAIIdentityMapParseException(String message, Throwable cause) {
+        super("AAI_3000", cause, message);
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AmbiguousMapAAIException.java b/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AmbiguousMapAAIException.java
index 7ee494a4..edd0b7fb 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AmbiguousMapAAIException.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/exceptions/AmbiguousMapAAIException.java
@@ -17,24 +17,25 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class AmbiguousMapAAIException extends AAIException {
-	
-	private static final long serialVersionUID = -878581771971431246L;
-	
-	public AmbiguousMapAAIException(String message) {
-		super("AAI_6146", message);
-	}
-
-	public AmbiguousMapAAIException(Throwable cause) {
-		super("AAI_6146",cause);
-	}
-
-	public AmbiguousMapAAIException(String message, Throwable cause) {
-		super("AAI_6146", cause, message);
-	}
+
+    private static final long serialVersionUID = -878581771971431246L;
+
+    public AmbiguousMapAAIException(String message) {
+        super("AAI_6146", message);
+    }
+
+    public AmbiguousMapAAIException(Throwable cause) {
+        super("AAI_6146", cause);
+    }
+
+    public AmbiguousMapAAIException(String message, Throwable cause) {
+        super("AAI_6146", cause, message);
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/exceptions/DoesNotStartWithValidNamespaceException.java b/aai-core/src/main/java/org/onap/aai/parsers/exceptions/DoesNotStartWithValidNamespaceException.java
index 88cdc47b..dedfa4c5 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/exceptions/DoesNotStartWithValidNamespaceException.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/exceptions/DoesNotStartWithValidNamespaceException.java
@@ -17,25 +17,25 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.exceptions;
 
 import org.onap.aai.exceptions.AAIException;
 
 public class DoesNotStartWithValidNamespaceException extends AAIException {
 
-	private static final long serialVersionUID = -888876613879411865L;
-	
-	public DoesNotStartWithValidNamespaceException(String message) {
-		super("AAI_3000", message);
-	}
+    private static final long serialVersionUID = -888876613879411865L;
 
-	public DoesNotStartWithValidNamespaceException(Throwable cause) {
-		super("AAI_3000",cause);
-	}
+    public DoesNotStartWithValidNamespaceException(String message) {
+        super("AAI_3000", message);
+    }
 
-	public DoesNotStartWithValidNamespaceException(String message, Throwable cause) {
-		super("AAI_3000", cause, message);
-	}
+    public DoesNotStartWithValidNamespaceException(Throwable cause) {
+        super("AAI_3000", cause);
+    }
 
-}
+    public DoesNotStartWithValidNamespaceException(String message, Throwable cause) {
+        super("AAI_3000", cause, message);
+    }
 
+}
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/LegacyQueryParser.java b/aai-core/src/main/java/org/onap/aai/parsers/query/LegacyQueryParser.java
index d20915c4..c9412733 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/LegacyQueryParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/LegacyQueryParser.java
@@ -17,10 +17,21 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.*;
+import java.util.Map.Entry;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -32,197 +43,202 @@ import org.onap.aai.parsers.uri.URIToObject;
 import org.onap.aai.query.builder.QueryBuilder;
 import org.onap.aai.restcore.util.URITools;
 import org.onap.aai.schema.enums.PropertyMetadata;
-import org.onap.aai.edges.enums.EdgeType;
-
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.*;
-import java.util.Map.Entry;
 
 /**
  * The Class LegacyQueryParser.
  */
 public class LegacyQueryParser extends QueryParser implements Parsable {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(LegacyQueryParser.class);
-
-	private Introspector previous = null;
-
-	/**
-	 * Instantiates a new legacy query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 * @param uri the uri
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public LegacyQueryParser(Loader loader, QueryBuilder queryBuilder, URI uri) throws UnsupportedEncodingException, AAIException {
-		super(loader, queryBuilder, uri);
-		URIParser parser = new URIParser(loader, uri);
-		parser.parse(this);
-	}
-	
-	/**
-	 * Instantiates a new legacy query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 * @param uri the uri
-	 * @param queryParams the query params
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public LegacyQueryParser(Loader loader, QueryBuilder queryBuilder, URI uri, MultivaluedMap queryParams) throws UnsupportedEncodingException, AAIException {
-		super(loader, queryBuilder, uri);
-		URIParser parser = new URIParser(loader, uri, queryParams);
-		parser.parse(this);
-	}
-
-	/**
-	 * Instantiates a new legacy query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 */
-	public LegacyQueryParser(Loader loader, QueryBuilder queryBuilder) {
-		super(loader, queryBuilder);
-	}
-
-	/**
-	 * @throws AAIException 
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys) throws AAIException {
-		if (previous != null) {
-			this.parentResourceType = previous.getDbName();
-			queryBuilder.createEdgeTraversal(type, previous, obj);
-		}
-		if (previous == null) {
-			queryBuilder.createDBQuery(obj);
-			this.handleUriKeys(obj, uriKeys);
-		} else {
-			queryBuilder.createKeyQuery(obj);
-			this.handleUriKeys(obj, uriKeys);
-		}
-		previous = obj;
-		this.resultResource = obj.getDbName();		
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys, boolean isFinalContainer) throws AAIException {
-		if (isFinalContainer) {
-			if (previous != null) {
-				this.parentResourceType = previous.getDbName();
-				queryBuilder.createEdgeTraversal(type, previous, obj);
-			}
-			
-			if (previous == null) {
-				queryBuilder.createContainerQuery(obj);
-				queryBuilder.markParentBoundary();
-			}
-			if (!uriKeys.isEmpty()) {
-
-				try {
-					Introspector child = obj.newIntrospectorInstanceOfNestedProperty(obj.getChildName());
-					this.handleUriKeys(child, uriKeys);
-				} catch (AAIUnknownObjectException e) {
-					LOGGER.warn("Skipping container child " + obj.getChildName() + " (Unknown Object) " +
-							LogFormatTools.getStackTop(e));
-				}
-			}
-			
-			this.resultResource = obj.getChildDBName();
-			this.containerResource = obj.getName();
-		}
-	}
-	private void handleUriKeys(Introspector obj, MultivaluedMap uriKeys) throws AAIException {
-		for (String key : uriKeys.keySet()) {
-			//to validate whether this property exists
-			if (!obj.hasProperty(key)) {
-				throw new AAIException("AAI_3000", "property: " + key + " not found on " + obj.getDbName());
-			}
-
-			List values = uriKeys.get(key);
-			String dbPropertyName = key;
-			Map linkedProperties = new HashMap<>();
-			final Map metadata = obj.getPropertyMetadata(key);
-			if (metadata.containsKey(PropertyMetadata.DATA_LINK)) {
-				linkedProperties.put(key, metadata.get(PropertyMetadata.DATA_LINK));
-			}
-			if (metadata.containsKey(PropertyMetadata.DB_ALIAS)) {
-				dbPropertyName = metadata.get(PropertyMetadata.DB_ALIAS);
-			}
-			
-			if (!linkedProperties.containsKey(key)) {
-				if (values.size() > 1) {
-					queryBuilder.getVerticesByIndexedProperty(dbPropertyName, obj.castValueAccordingToSchema(key, values));
-				} else {
-					queryBuilder.getVerticesByIndexedProperty(dbPropertyName, obj.castValueAccordingToSchema(key, values.get(0)));
-				}
-			}
-			handleLinkedProperties(obj, uriKeys, linkedProperties);
-		}
-	}
-	private void handleLinkedProperties(Introspector obj, MultivaluedMap uriKeys, Map linkedProperties) throws AAIException {
-		
-		QueryBuilder[] builders = new QueryBuilder[linkedProperties.keySet().size()];
-		Set> entrySet = linkedProperties.entrySet();
-		int i = 0;
-		Iterator> itr = entrySet.iterator();
-		
-		while (itr.hasNext()) {
-			Entry entry = itr.next();
-			Introspector child;
-			try {
-				child = new URIToObject(this.latestLoader, new URI(URITools.replaceTemplates(obj, entry.getValue(), PropertyMetadata.DATA_LINK, true).orElse(""))).getEntity();
-			} catch (IllegalArgumentException | UnsupportedEncodingException | URISyntaxException e) {
-				throw new AAIException("AAI_4000", e);
-			} 
-			List values = uriKeys.get(entry.getKey());
-			QueryBuilder builder = queryBuilder.newInstance();
-			builder.createEdgeTraversal(EdgeType.TREE, obj, child);
-			if (values.size() > 1) {
-				builder.getVerticesByIndexedProperty(entry.getKey(), obj.castValueAccordingToSchema(entry.getKey(), values));
-			} else {
-				builder.getVerticesByIndexedProperty(entry.getKey(), obj.castValueAccordingToSchema(entry.getKey(), values.get(0)));
-			}
-			
-			builders[i] = builder;
-			i++;
-		}
-		
-		queryBuilder.where(builders);
-		
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processNamespace(Introspector obj) {
-	
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String getCloudRegionTransform() {
-		return "add";
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public boolean useOriginalLoader() {
-		return false;
-	}
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(LegacyQueryParser.class);
+
+    private Introspector previous = null;
+
+    /**
+     * Instantiates a new legacy query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     * @param uri the uri
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public LegacyQueryParser(Loader loader, QueryBuilder queryBuilder, URI uri)
+            throws UnsupportedEncodingException, AAIException {
+        super(loader, queryBuilder, uri);
+        URIParser parser = new URIParser(loader, uri);
+        parser.parse(this);
+    }
+
+    /**
+     * Instantiates a new legacy query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     * @param uri the uri
+     * @param queryParams the query params
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public LegacyQueryParser(Loader loader, QueryBuilder queryBuilder, URI uri,
+            MultivaluedMap queryParams) throws UnsupportedEncodingException, AAIException {
+        super(loader, queryBuilder, uri);
+        URIParser parser = new URIParser(loader, uri, queryParams);
+        parser.parse(this);
+    }
+
+    /**
+     * Instantiates a new legacy query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     */
+    public LegacyQueryParser(Loader loader, QueryBuilder queryBuilder) {
+        super(loader, queryBuilder);
+    }
+
+    /**
+     * @throws AAIException
+     * @{inheritDoc}
+     */
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
+            throws AAIException {
+        if (previous != null) {
+            this.parentResourceType = previous.getDbName();
+            queryBuilder.createEdgeTraversal(type, previous, obj);
+        }
+        if (previous == null) {
+            queryBuilder.createDBQuery(obj);
+            this.handleUriKeys(obj, uriKeys);
+        } else {
+            queryBuilder.createKeyQuery(obj);
+            this.handleUriKeys(obj, uriKeys);
+        }
+        previous = obj;
+        this.resultResource = obj.getDbName();
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException {
+        if (isFinalContainer) {
+            if (previous != null) {
+                this.parentResourceType = previous.getDbName();
+                queryBuilder.createEdgeTraversal(type, previous, obj);
+            }
+
+            if (previous == null) {
+                queryBuilder.createContainerQuery(obj);
+                queryBuilder.markParentBoundary();
+            }
+            if (!uriKeys.isEmpty()) {
+
+                try {
+                    Introspector child = obj.newIntrospectorInstanceOfNestedProperty(obj.getChildName());
+                    this.handleUriKeys(child, uriKeys);
+                } catch (AAIUnknownObjectException e) {
+                    LOGGER.warn("Skipping container child " + obj.getChildName() + " (Unknown Object) "
+                            + LogFormatTools.getStackTop(e));
+                }
+            }
+
+            this.resultResource = obj.getChildDBName();
+            this.containerResource = obj.getName();
+        }
+    }
+
+    private void handleUriKeys(Introspector obj, MultivaluedMap uriKeys) throws AAIException {
+        for (String key : uriKeys.keySet()) {
+            // to validate whether this property exists
+            if (!obj.hasProperty(key)) {
+                throw new AAIException("AAI_3000", "property: " + key + " not found on " + obj.getDbName());
+            }
+
+            List values = uriKeys.get(key);
+            String dbPropertyName = key;
+            Map linkedProperties = new HashMap<>();
+            final Map metadata = obj.getPropertyMetadata(key);
+            if (metadata.containsKey(PropertyMetadata.DATA_LINK)) {
+                linkedProperties.put(key, metadata.get(PropertyMetadata.DATA_LINK));
+            }
+            if (metadata.containsKey(PropertyMetadata.DB_ALIAS)) {
+                dbPropertyName = metadata.get(PropertyMetadata.DB_ALIAS);
+            }
+
+            if (!linkedProperties.containsKey(key)) {
+                if (values.size() > 1) {
+                    queryBuilder.getVerticesByIndexedProperty(dbPropertyName,
+                            obj.castValueAccordingToSchema(key, values));
+                } else {
+                    queryBuilder.getVerticesByIndexedProperty(dbPropertyName,
+                            obj.castValueAccordingToSchema(key, values.get(0)));
+                }
+            }
+            handleLinkedProperties(obj, uriKeys, linkedProperties);
+        }
+    }
+
+    private void handleLinkedProperties(Introspector obj, MultivaluedMap uriKeys,
+            Map linkedProperties) throws AAIException {
+
+        QueryBuilder[] builders = new QueryBuilder[linkedProperties.keySet().size()];
+        Set> entrySet = linkedProperties.entrySet();
+        int i = 0;
+        Iterator> itr = entrySet.iterator();
+
+        while (itr.hasNext()) {
+            Entry entry = itr.next();
+            Introspector child;
+            try {
+                child = new URIToObject(this.latestLoader, new URI(
+                        URITools.replaceTemplates(obj, entry.getValue(), PropertyMetadata.DATA_LINK, true).orElse("")))
+                                .getEntity();
+            } catch (IllegalArgumentException | UnsupportedEncodingException | URISyntaxException e) {
+                throw new AAIException("AAI_4000", e);
+            }
+            List values = uriKeys.get(entry.getKey());
+            QueryBuilder builder = queryBuilder.newInstance();
+            builder.createEdgeTraversal(EdgeType.TREE, obj, child);
+            if (values.size() > 1) {
+                builder.getVerticesByIndexedProperty(entry.getKey(),
+                        obj.castValueAccordingToSchema(entry.getKey(), values));
+            } else {
+                builder.getVerticesByIndexedProperty(entry.getKey(),
+                        obj.castValueAccordingToSchema(entry.getKey(), values.get(0)));
+            }
+
+            builders[i] = builder;
+            i++;
+        }
+
+        queryBuilder.where(builders);
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processNamespace(Introspector obj) {
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String getCloudRegionTransform() {
+        return "add";
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public boolean useOriginalLoader() {
+        return false;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/ObjectNameQueryParser.java b/aai-core/src/main/java/org/onap/aai/parsers/query/ObjectNameQueryParser.java
index 29790225..776e4017 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/ObjectNameQueryParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/ObjectNameQueryParser.java
@@ -20,16 +20,17 @@
 /**
  * 
  */
+
 package org.onap.aai.parsers.query;
 
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.query.builder.QueryBuilder;
 
 public class ObjectNameQueryParser extends QueryParser {
-	
-	public ObjectNameQueryParser(Loader loader, QueryBuilder queryBuilder, String objName) {
-		super(loader, queryBuilder);
-		this.resultResource = objName;
-	}
+
+    public ObjectNameQueryParser(Loader loader, QueryBuilder queryBuilder, String objName) {
+        super(loader, queryBuilder);
+        this.resultResource = objName;
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParser.java b/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParser.java
index d7f1832c..0b1deb55 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParser.java
@@ -17,8 +17,11 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
+import java.net.URI;
+
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.config.SpringContextAware;
 import org.onap.aai.introspection.Loader;
@@ -27,124 +30,122 @@ import org.onap.aai.introspection.LoaderUtil;
 import org.onap.aai.query.builder.QueryBuilder;
 import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.setup.SchemaVersions;
-import java.net.URI;
 
 /**
  * The Class QueryParser.
  */
 public abstract class QueryParser {
 
-	protected Loader loader = null;
-	protected Loader latestLoader = null;
-	protected QueryBuilder queryBuilder = null;
-
-	protected QueryBuilder parentQueryBuilder = null;
-
-	protected URI uri = null;
-
-	protected String resultResource = "";
-
-	protected String parentResourceType = "";
-
-	protected String containerResource = "";
-
-	/**
-	 * Instantiates a new query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 * @param uri the uri
-	 */
-	protected QueryParser(Loader loader, QueryBuilder queryBuilder, URI uri) {
-		this.uri = uri;
-		this.queryBuilder = queryBuilder;
-		this.loader = loader;
-		LoaderFactory loaderFactory = SpringContextAware.getBean(LoaderFactory.class);
-		SchemaVersion latest = ((SchemaVersions) SpringContextAware.getBean("schemaVersions")).getDefaultVersion();
-
-		this.latestLoader = loaderFactory.createLoaderForVersion(loader.getModelType(), latest);
-	}
-
-	/**
-	 * Instantiates a new query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 */
-	protected QueryParser(Loader loader, QueryBuilder queryBuilder) {
-		this.queryBuilder = queryBuilder;
-		this.loader = loader;
-		this.latestLoader = LoaderUtil.getLatestVersion();
-	}
-
-	/**
-	 * Gets the container type.
-	 *
-	 * @return the container type
-	 */
-	public String getContainerType() {
-
-		return this.containerResource;
-	}
-
-	/**
-	 * Gets the parent result type.
-	 *
-	 * @return the parent result type
-	 */
-	public String getParentResultType() {
-		return this.parentResourceType;
-	}
-
-	/**
-	 * Gets the result type.
-	 *
-	 * @return the result type
-	 */
-	public String getResultType() {
-		return this.resultResource;
-	}
-
-	/**
-	 * Gets the query builder.
-	 *
-	 * @return the query builder
-	 */
-	public QueryBuilder getQueryBuilder() {
-		return this.queryBuilder;
-	}
-
-	/**
-	 * Gets the uri.
-	 *
-	 * @return the uri
-	 */
-	public URI getUri() {
-		return this.uri;
-	}
-
-	/**
-	 * Gets the parent query builder.
-	 *
-	 * @return the parent query builder
-	 */
-	public QueryBuilder getParentQueryBuilder() {
-		if (this.parentQueryBuilder != null) {
-			return this.parentQueryBuilder;
-		} else {
-			return this.queryBuilder;
-		}
-	}
-
-	/**
-	 * Checks if is dependent.
-	 *
-	 * @return true, if is dependent
-	 */
-	public boolean isDependent() {
-		return !this.queryBuilder.getQuery().toString().equals(this.queryBuilder.getParentQuery().getQuery().toString());
-	}
+    protected Loader loader = null;
+    protected Loader latestLoader = null;
+    protected QueryBuilder queryBuilder = null;
+
+    protected QueryBuilder parentQueryBuilder = null;
+
+    protected URI uri = null;
+
+    protected String resultResource = "";
+
+    protected String parentResourceType = "";
+
+    protected String containerResource = "";
+
+    /**
+     * Instantiates a new query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     * @param uri the uri
+     */
+    protected QueryParser(Loader loader, QueryBuilder queryBuilder, URI uri) {
+        this.uri = uri;
+        this.queryBuilder = queryBuilder;
+        this.loader = loader;
+        LoaderFactory loaderFactory = SpringContextAware.getBean(LoaderFactory.class);
+        SchemaVersion latest = ((SchemaVersions) SpringContextAware.getBean("schemaVersions")).getDefaultVersion();
+
+        this.latestLoader = loaderFactory.createLoaderForVersion(loader.getModelType(), latest);
+    }
+
+    /**
+     * Instantiates a new query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     */
+    protected QueryParser(Loader loader, QueryBuilder queryBuilder) {
+        this.queryBuilder = queryBuilder;
+        this.loader = loader;
+        this.latestLoader = LoaderUtil.getLatestVersion();
+    }
+
+    /**
+     * Gets the container type.
+     *
+     * @return the container type
+     */
+    public String getContainerType() {
+
+        return this.containerResource;
+    }
+
+    /**
+     * Gets the parent result type.
+     *
+     * @return the parent result type
+     */
+    public String getParentResultType() {
+        return this.parentResourceType;
+    }
+
+    /**
+     * Gets the result type.
+     *
+     * @return the result type
+     */
+    public String getResultType() {
+        return this.resultResource;
+    }
+
+    /**
+     * Gets the query builder.
+     *
+     * @return the query builder
+     */
+    public QueryBuilder getQueryBuilder() {
+        return this.queryBuilder;
+    }
+
+    /**
+     * Gets the uri.
+     *
+     * @return the uri
+     */
+    public URI getUri() {
+        return this.uri;
+    }
+
+    /**
+     * Gets the parent query builder.
+     *
+     * @return the parent query builder
+     */
+    public QueryBuilder getParentQueryBuilder() {
+        if (this.parentQueryBuilder != null) {
+            return this.parentQueryBuilder;
+        } else {
+            return this.queryBuilder;
+        }
+    }
+
+    /**
+     * Checks if is dependent.
+     *
+     * @return true, if is dependent
+     */
+    public boolean isDependent() {
+        return !this.queryBuilder.getQuery().toString()
+                .equals(this.queryBuilder.getParentQuery().getQuery().toString());
+    }
 
 }
-
-
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParserStrategy.java b/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParserStrategy.java
index e8ff60b3..18600b95 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParserStrategy.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/QueryParserStrategy.java
@@ -17,74 +17,78 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.query.builder.QueryBuilder;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-
 /**
  * The Class QueryParserStrategy.
  */
 public abstract class QueryParserStrategy {
 
-	protected Loader loader = null;
-	
-	protected QueryBuilder builder = null;
-	
-	/**
-	 * Instantiates a new query parser strategy.
-	 *
-	 * @param loader the loader
-	 * @param builder the builder
-	 */
-	public QueryParserStrategy(Loader loader, QueryBuilder builder) {
-		
-		this.loader = loader;
-		this.builder = builder;
-	}
-	
-	/**
-	 * Builds the URI parser.
-	 *
-	 * @param uri the uri
-	 * @return the query parser
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public abstract QueryParser buildURIParser(URI uri) throws UnsupportedEncodingException, AAIException;
-	
-	/**
-	 * Builds the URI parser.
-	 *
-	 * @param uri the uri
-	 * @param queryParams the query params
-	 * @return the query parser
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public abstract QueryParser buildURIParser(URI uri,MultivaluedMap queryParams) throws UnsupportedEncodingException, AAIException;
+    protected Loader loader = null;
+
+    protected QueryBuilder builder = null;
+
+    /**
+     * Instantiates a new query parser strategy.
+     *
+     * @param loader the loader
+     * @param builder the builder
+     */
+    public QueryParserStrategy(Loader loader, QueryBuilder builder) {
+
+        this.loader = loader;
+        this.builder = builder;
+    }
+
+    /**
+     * Builds the URI parser.
+     *
+     * @param uri the uri
+     * @return the query parser
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public abstract QueryParser buildURIParser(URI uri) throws UnsupportedEncodingException, AAIException;
+
+    /**
+     * Builds the URI parser.
+     *
+     * @param uri the uri
+     * @param queryParams the query params
+     * @return the query parser
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public abstract QueryParser buildURIParser(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException;
+
+    /**
+     * Builds the relationship parser.
+     *
+     * @param obj the obj
+     * @return the query parser
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public abstract QueryParser buildRelationshipParser(Introspector obj)
+            throws UnsupportedEncodingException, AAIException;
 
-	/**
-	 * Builds the relationship parser.
-	 *
-	 * @param obj the obj
-	 * @return the query parser
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public abstract QueryParser buildRelationshipParser(Introspector obj) throws UnsupportedEncodingException, AAIException;
-	
-	/**
-	 * Builds an ObjectNameQueryParser. 
-	 * 
-	 * @param objName - the name of the object type as used in the database
-	 * @return
-	 */
-	public abstract QueryParser buildObjectNameParser(String objName);
+    /**
+     * Builds an ObjectNameQueryParser.
+     * 
+     * @param objName - the name of the object type as used in the database
+     * @return
+     */
+    public abstract QueryParser buildObjectNameParser(String objName);
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/RelationshipQueryParser.java b/aai-core/src/main/java/org/onap/aai/parsers/query/RelationshipQueryParser.java
index c3ca5cba..0958a81e 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/RelationshipQueryParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/RelationshipQueryParser.java
@@ -17,10 +17,14 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
+
+import java.io.UnsupportedEncodingException;
+
 import org.onap.aai.config.SpringContextAware;
 import org.onap.aai.edges.EdgeIngestor;
 import org.onap.aai.exceptions.AAIException;
@@ -32,49 +36,48 @@ import org.onap.aai.parsers.uri.URIParser;
 import org.onap.aai.query.builder.QueryBuilder;
 import org.springframework.context.ApplicationContext;
 
-import java.io.UnsupportedEncodingException;
-
 /**
  * The Class RelationshipQueryParser.
  */
 public class RelationshipQueryParser extends LegacyQueryParser {
 
-	private static final EELFLogger logger = EELFManager.getInstance().getLogger(RelationshipQueryParser.class);
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(RelationshipQueryParser.class);
+
+    private Introspector relationship = null;
+
+    private ModelType modelType = null;
+
+    private EdgeIngestor edgeRules = null;
 
-	private Introspector relationship = null;
-	
-	private ModelType modelType = null;
-	
-	private EdgeIngestor edgeRules = null;
-	
-	/**
-	 * Instantiates a new relationship query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 * @param obj the obj
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public RelationshipQueryParser(Loader loader, QueryBuilder queryBuilder, Introspector obj) throws UnsupportedEncodingException, AAIException {
-		super(loader, queryBuilder);
-		this.relationship = obj;
-		this.modelType = obj.getModelType();
-		initBeans();
-		RelationshipToURI rToUri = new RelationshipToURI(loader, obj);
-		this.uri = rToUri.getUri();
-		URIParser parser = new URIParser(loader, uri);
-		parser.parse(this);
-	}
+    /**
+     * Instantiates a new relationship query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     * @param obj the obj
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public RelationshipQueryParser(Loader loader, QueryBuilder queryBuilder, Introspector obj)
+            throws UnsupportedEncodingException, AAIException {
+        super(loader, queryBuilder);
+        this.relationship = obj;
+        this.modelType = obj.getModelType();
+        initBeans();
+        RelationshipToURI rToUri = new RelationshipToURI(loader, obj);
+        this.uri = rToUri.getUri();
+        URIParser parser = new URIParser(loader, uri);
+        parser.parse(this);
+    }
 
-	private void initBeans() {
-		ApplicationContext ctx = SpringContextAware.getApplicationContext();
-		if (ctx == null) {
-		    logger.warn("Unable to retrieve the spring context");
-		} else {
-			EdgeIngestor ei = ctx.getBean(EdgeIngestor.class);
-			this.edgeRules = ei;
-		}
-	}
+    private void initBeans() {
+        ApplicationContext ctx = SpringContextAware.getApplicationContext();
+        if (ctx == null) {
+            logger.warn("Unable to retrieve the spring context");
+        } else {
+            EdgeIngestor ei = ctx.getBean(EdgeIngestor.class);
+            this.edgeRules = ei;
+        }
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/TraversalStrategy.java b/aai-core/src/main/java/org/onap/aai/parsers/query/TraversalStrategy.java
index 64f8eebb..a0311c70 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/TraversalStrategy.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/TraversalStrategy.java
@@ -17,65 +17,65 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.query.builder.QueryBuilder;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-
 /**
  * The Class TraversalStrategy.
  */
 public class TraversalStrategy extends QueryParserStrategy {
 
+    /**
+     * Instantiates a new traversal strategy.
+     *
+     * @param loader the loader
+     * @param builder the builder
+     */
+    public TraversalStrategy(Loader loader, QueryBuilder builder) {
+        super(loader, builder);
+    }
 
-	/**
-	 * Instantiates a new traversal strategy.
-	 *
-	 * @param loader the loader
-	 * @param builder the builder
-	 */
-	public TraversalStrategy(Loader loader, QueryBuilder builder) {
-		super(loader, builder);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildURIParser(URI uri) throws UnsupportedEncodingException, AAIException {
-		return new LegacyQueryParser(loader, builder, uri);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildRelationshipParser(Introspector obj) throws UnsupportedEncodingException, AAIException {
-		return new RelationshipQueryParser(loader, builder, obj);
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildURIParser(URI uri) throws UnsupportedEncodingException, AAIException {
+        return new LegacyQueryParser(loader, builder, uri);
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildURIParser(URI uri, MultivaluedMap queryParams)
-			throws UnsupportedEncodingException, AAIException {
-		return new LegacyQueryParser(loader, builder, uri, queryParams);
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildRelationshipParser(Introspector obj) throws UnsupportedEncodingException, AAIException {
+        return new RelationshipQueryParser(loader, builder, obj);
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildObjectNameParser(String objName) {
-		return new ObjectNameQueryParser(loader, builder, objName);
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildURIParser(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException {
+        return new LegacyQueryParser(loader, builder, uri, queryParams);
+    }
 
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildObjectNameParser(String objName) {
+        return new ObjectNameQueryParser(loader, builder, objName);
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueRelationshipQueryParser.java b/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueRelationshipQueryParser.java
index f7f27053..126272a8 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueRelationshipQueryParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueRelationshipQueryParser.java
@@ -17,40 +17,41 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
+import java.io.UnsupportedEncodingException;
+
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.parsers.relationship.RelationshipToURI;
 import org.onap.aai.query.builder.QueryBuilder;
 
-import java.io.UnsupportedEncodingException;
-
 /**
  * The Class UniqueRelationshipQueryParser.
  */
 public class UniqueRelationshipQueryParser extends UniqueURIQueryParser {
 
+    /**
+     * Instantiates a new unique relationship query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     * @param obj the obj
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws IllegalArgumentException the illegal argument exception
+     * @throws AAIException the AAI exception
+     */
+    public UniqueRelationshipQueryParser(Loader loader, QueryBuilder queryBuilder, Introspector obj)
+            throws UnsupportedEncodingException, IllegalArgumentException, AAIException {
+        super(loader, queryBuilder);
+        RelationshipToURI rToUri = new RelationshipToURI(loader, obj);
+        UniqueURIQueryParser parser = new UniqueURIQueryParser(loader, queryBuilder, rToUri.getUri());
+        this.containerResource = parser.getContainerType();
+        this.resultResource = parser.getResultType();
+        this.queryBuilder = parser.getQueryBuilder();
+        this.parentQueryBuilder = parser.getParentQueryBuilder();
+    }
 
-	/**
-	 * Instantiates a new unique relationship query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 * @param obj the obj
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws AAIException the AAI exception
-	 */
-	public UniqueRelationshipQueryParser(Loader loader, QueryBuilder queryBuilder, Introspector obj) throws UnsupportedEncodingException, IllegalArgumentException, AAIException {
-		super(loader, queryBuilder);
-		RelationshipToURI rToUri = new RelationshipToURI(loader, obj);
-		UniqueURIQueryParser parser = new UniqueURIQueryParser(loader, queryBuilder, rToUri.getUri());
-		this.containerResource = parser.getContainerType();
-		this.resultResource = parser.getResultType();
-		this.queryBuilder = parser.getQueryBuilder();
-		this.parentQueryBuilder = parser.getParentQueryBuilder();
-	}
-	
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueStrategy.java b/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueStrategy.java
index 5712158a..16403c00 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueStrategy.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueStrategy.java
@@ -17,64 +17,65 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.query.builder.QueryBuilder;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-
 /**
  * The Class UniqueStrategy.
  */
 public class UniqueStrategy extends QueryParserStrategy {
 
-	
+    /**
+     * Instantiates a new unique strategy.
+     *
+     * @param loader the loader
+     * @param builder the builder
+     */
+    public UniqueStrategy(Loader loader, QueryBuilder builder) {
+        super(loader, builder);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildURIParser(URI uri)
+            throws UnsupportedEncodingException, IllegalArgumentException, AAIException {
+        return new UniqueURIQueryParser(loader, builder, uri);
+    }
 
-	/**
-	 * Instantiates a new unique strategy.
-	 *
-	 * @param loader the loader
-	 * @param builder the builder
-	 */
-	public UniqueStrategy(Loader loader, QueryBuilder builder) {
-		super(loader, builder);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildURIParser(URI uri) throws UnsupportedEncodingException, IllegalArgumentException, AAIException {
-		return new UniqueURIQueryParser(loader, builder, uri);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildRelationshipParser(Introspector obj) throws UnsupportedEncodingException, AAIException {
-		return new UniqueRelationshipQueryParser(loader, builder, obj);
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildRelationshipParser(Introspector obj) throws UnsupportedEncodingException, AAIException {
+        return new UniqueRelationshipQueryParser(loader, builder, obj);
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildURIParser(URI uri, MultivaluedMap queryParams)
-			throws UnsupportedEncodingException, AAIException {
-		return new LegacyQueryParser(loader, builder, uri, queryParams);
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildURIParser(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException {
+        return new LegacyQueryParser(loader, builder, uri, queryParams);
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser buildObjectNameParser(String objName) {
-		return new ObjectNameQueryParser(loader, builder, objName);
-	}
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser buildObjectNameParser(String objName) {
+        return new ObjectNameQueryParser(loader, builder, objName);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueURIQueryParser.java b/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueURIQueryParser.java
index 3f14eecb..33baa40a 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueURIQueryParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/query/UniqueURIQueryParser.java
@@ -17,8 +17,16 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.query;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriBuilder;
+
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -26,138 +34,131 @@ import org.onap.aai.parsers.uri.Parsable;
 import org.onap.aai.parsers.uri.URIParser;
 import org.onap.aai.parsers.uri.URIToDBKey;
 import org.onap.aai.query.builder.QueryBuilder;
-import org.onap.aai.edges.enums.EdgeType;
-
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriBuilder;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-
 
 /**
  * The Class UniqueURIQueryParser.
  */
 public class UniqueURIQueryParser extends QueryParser implements Parsable {
 
-	
-	private URIToDBKey dbKeyParser = null;
-	
-	private Introspector previous = null;
-	
-	private boolean endsInContainer = false;
-	
-	private Introspector finalContainer = null;
-	
-	private String parentName = "";
-	
-	/**
-	 * Instantiates a new unique URI query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 * @param uri the uri
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws AAIException the AAI exception
-	 */
-	public UniqueURIQueryParser(Loader loader, QueryBuilder queryBuilder, URI uri) throws UnsupportedEncodingException, IllegalArgumentException, AAIException {
-		super(loader, queryBuilder, uri);
-		URIParser parser = new URIParser(loader, uri);
-		parser.parse(this);
-		
-		if (!endsInContainer) {
-			this.dbKeyParser = new URIToDBKey(loader, uri);
-			String dbKey = (String)dbKeyParser.getResult();
-			queryBuilder.getVerticesByIndexedProperty("aai-unique-key", dbKey);
-			queryBuilder.markParentBoundary();
-			
-			if (!(parentName.equals("") || parentName.equals(this.resultResource))) {
-				URI parentUri = UriBuilder.fromPath(uri.getRawPath().substring(0, uri.getRawPath().indexOf(containerResource))).build();
-				this.dbKeyParser = new URIToDBKey(loader, parentUri);
-				this.parentQueryBuilder = queryBuilder.newInstance().getVerticesByIndexedProperty("aai-unique-key", (String)dbKeyParser.getResult());
-				this.parentResourceType = parentName;
-			} 
-			this.containerResource = "";
-		} else {
-			URI parentUri = UriBuilder.fromPath(uri.getRawPath().substring(0, uri.getRawPath().indexOf(this.finalContainer.getDbName()))).build();
-			this.dbKeyParser = new URIToDBKey(loader, parentUri);
-			String dbKey = (String)dbKeyParser.getResult();
-			this.parentResourceType = parentName;
-
-			if (!dbKey.equals("")) {
-				queryBuilder.getVerticesByIndexedProperty("aai-unique-key", dbKey);
-				queryBuilder.markParentBoundary();
-				queryBuilder.createEdgeTraversal(EdgeType.TREE, previous, finalContainer);
-
-			} 
-			
-			queryBuilder.createContainerQuery(finalContainer);
-				
-			
-		}
-	}
-	
-	
-	/**
-	 * Instantiates a new unique URI query parser.
-	 *
-	 * @param loader the loader
-	 * @param queryBuilder the query builder
-	 */
-	public UniqueURIQueryParser(Loader loader, QueryBuilder queryBuilder) {
-		super(loader, queryBuilder);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processNamespace(Introspector obj) {
-	
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String getCloudRegionTransform() {
-		return "add";
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public boolean useOriginalLoader() {
-		return false;
-	}
-
-
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
-			throws AAIException {
-		this.resultResource = obj.getDbName();
-		if (previous != null) {
-			this.parentName = previous.getDbName();
-		}
-		this.previous  = obj;
-				
-	}
-
-
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
-			boolean isFinalContainer) throws AAIException {
-		this.containerResource = obj.getName();
-		if (previous != null) {
-			this.parentName = previous.getDbName();
-		}
-		if (isFinalContainer) {
-			this.endsInContainer = true;
-			this.resultResource = obj.getChildDBName();
-			
-			this.finalContainer = obj;
-		}		
-	}
-	
+    private URIToDBKey dbKeyParser = null;
+
+    private Introspector previous = null;
+
+    private boolean endsInContainer = false;
+
+    private Introspector finalContainer = null;
+
+    private String parentName = "";
+
+    /**
+     * Instantiates a new unique URI query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     * @param uri the uri
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws IllegalArgumentException the illegal argument exception
+     * @throws AAIException the AAI exception
+     */
+    public UniqueURIQueryParser(Loader loader, QueryBuilder queryBuilder, URI uri)
+            throws UnsupportedEncodingException, IllegalArgumentException, AAIException {
+        super(loader, queryBuilder, uri);
+        URIParser parser = new URIParser(loader, uri);
+        parser.parse(this);
+
+        if (!endsInContainer) {
+            this.dbKeyParser = new URIToDBKey(loader, uri);
+            String dbKey = (String) dbKeyParser.getResult();
+            queryBuilder.getVerticesByIndexedProperty("aai-unique-key", dbKey);
+            queryBuilder.markParentBoundary();
+
+            if (!(parentName.equals("") || parentName.equals(this.resultResource))) {
+                URI parentUri = UriBuilder
+                        .fromPath(uri.getRawPath().substring(0, uri.getRawPath().indexOf(containerResource))).build();
+                this.dbKeyParser = new URIToDBKey(loader, parentUri);
+                this.parentQueryBuilder = queryBuilder.newInstance().getVerticesByIndexedProperty("aai-unique-key",
+                        (String) dbKeyParser.getResult());
+                this.parentResourceType = parentName;
+            }
+            this.containerResource = "";
+        } else {
+            URI parentUri = UriBuilder
+                    .fromPath(uri.getRawPath().substring(0, uri.getRawPath().indexOf(this.finalContainer.getDbName())))
+                    .build();
+            this.dbKeyParser = new URIToDBKey(loader, parentUri);
+            String dbKey = (String) dbKeyParser.getResult();
+            this.parentResourceType = parentName;
+
+            if (!dbKey.equals("")) {
+                queryBuilder.getVerticesByIndexedProperty("aai-unique-key", dbKey);
+                queryBuilder.markParentBoundary();
+                queryBuilder.createEdgeTraversal(EdgeType.TREE, previous, finalContainer);
+
+            }
+
+            queryBuilder.createContainerQuery(finalContainer);
+
+        }
+    }
+
+    /**
+     * Instantiates a new unique URI query parser.
+     *
+     * @param loader the loader
+     * @param queryBuilder the query builder
+     */
+    public UniqueURIQueryParser(Loader loader, QueryBuilder queryBuilder) {
+        super(loader, queryBuilder);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processNamespace(Introspector obj) {
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String getCloudRegionTransform() {
+        return "add";
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public boolean useOriginalLoader() {
+        return false;
+    }
+
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
+            throws AAIException {
+        this.resultResource = obj.getDbName();
+        if (previous != null) {
+            this.parentName = previous.getDbName();
+        }
+        this.previous = obj;
+
+    }
+
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException {
+        this.containerResource = obj.getName();
+        if (previous != null) {
+            this.parentName = previous.getDbName();
+        }
+        if (isFinalContainer) {
+            this.endsInContainer = true;
+            this.resultResource = obj.getChildDBName();
+
+            this.finalContainer = obj;
+        }
+    }
+
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/relationship/RelationshipToURI.java b/aai-core/src/main/java/org/onap/aai/parsers/relationship/RelationshipToURI.java
index 8cbed6d6..0b072b88 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/relationship/RelationshipToURI.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/relationship/RelationshipToURI.java
@@ -17,275 +17,285 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.relationship;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+import javax.ws.rs.core.UriBuilder;
+
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.onap.aai.config.SpringContextAware;
 import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.edges.EdgeRule;
 import org.onap.aai.edges.EdgeRuleQuery;
+import org.onap.aai.edges.enums.AAIDirection;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.edges.exceptions.AmbiguousRuleChoiceException;
 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.*;
-import org.onap.aai.setup.SchemaVersions;
-
 import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
 import org.onap.aai.parsers.exceptions.AAIIdentityMapParseException;
 import org.onap.aai.parsers.exceptions.AmbiguousMapAAIException;
 import org.onap.aai.parsers.uri.URIParser;
 import org.onap.aai.schema.enums.ObjectMetadata;
-import org.onap.aai.edges.enums.AAIDirection;
-import org.onap.aai.edges.EdgeRule;
-import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.setup.SchemaVersions;
 import org.springframework.context.ApplicationContext;
 
-import javax.ws.rs.core.UriBuilder;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
-
 /**
  * The Class RelationshipToURI.
  */
 public class RelationshipToURI {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(RelationshipToURI.class);
-		
-	private Introspector relationship = null;
-	
-	private Loader loader = null;
-	
-	private ModelType modelType = null;
-	
-	private EdgeIngestor edgeRules = null;
+    private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(RelationshipToURI.class);
+
+    private Introspector relationship = null;
+
+    private Loader loader = null;
+
+    private ModelType modelType = null;
+
+    private EdgeIngestor edgeRules = null;
+
+    private URI uri = null;
+
+    private SchemaVersions schemaVersions;
+
+    /**
+     * Instantiates a new relationship to URI.
+     *
+     * @param loader the loader
+     * @param relationship the relationship
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public RelationshipToURI(Loader loader, Introspector relationship)
+            throws UnsupportedEncodingException, AAIException {
+        this.relationship = relationship;
+        this.modelType = relationship.getModelType();
+        this.loader = loader;
+        this.initEdgeIngestor();
+        this.parse();
+
+    }
+
+    protected void initEdgeIngestor() {
+        // TODO proper spring wiring, but that requires a lot of refactoring so for now we have this
+        ApplicationContext ctx = SpringContextAware.getApplicationContext();
+        edgeRules = ctx.getBean(EdgeIngestor.class);
+        schemaVersions = (SchemaVersions) ctx.getBean("schemaVersions");
+    }
+
+    /**
+     * Parses the.
+     * 
+     * @throws
+     *
+     *         @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    protected void parse() throws AAIException {
+        String relatedLink = (String) relationship.getValue("related-link");
+        Optional result;
+        try {
+            if (loader.getVersion().compareTo(schemaVersions.getRelatedLinkVersion()) >= 0) {
+                result = processRelatedLink(relatedLink);
+                if (!result.isPresent()) {
+                    result = processRelationshipData();
+                }
+            } else {
+                result = processRelationshipData();
+                if (!result.isPresent()) {
+                    result = processRelatedLink(relatedLink);
+                }
+            }
+            if (result.isPresent()) {
+                this.uri = result.get();
+            } else {
+                throw new AAIIdentityMapParseException("nothing to parse");
+            }
+        } catch (AAIException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new AAIIdentityMapParseException("Could not parse relationship-list object: " + e.getMessage(), e);
+        }
+
+    }
+
+    private Optional processRelationshipData() throws AAIException, UnsupportedEncodingException {
+        Optional result = Optional.empty();
+        StringBuilder uriBuilder = new StringBuilder();
+        List data = (List) relationship.getValue("relationship-data");
+        Introspector wrapper;
+        String key;
+        String value;
+        String objectType;
+        String propertyName;
+        String topLevelType = null;
+        String[] split;
+        HashMap map = new HashMap<>();
+        for (Object datum : data) {
+            wrapper = IntrospectorFactory.newInstance(modelType, datum);
+            key = (String) wrapper.getValue("relationship-key");
+            value = (String) wrapper.getValue("relationship-value");
+            split = key.split("\\.");
+            if (split == null || split.length != 2) {
+                throw new AAIIdentityMapParseException(
+                        "incorrect format for key must be of the form {node-type}.{property-name}");
+            }
+            // check node name ok
+            // check prop name ok
+            objectType = split[0];
+            propertyName = split[1];
+
+            try {
+                Introspector wrappedObj = loader.introspectorFromName(objectType);
+
+                if (!wrappedObj.hasProperty(propertyName)) {
+                    throw new AAIIdentityMapParseException("invalid property name in map: " + propertyName);
+                }
+                if (map.containsKey(objectType)) {
+                    wrappedObj = map.get(objectType);
+                } else {
+                    map.put(objectType, wrappedObj);
+                }
+                if (wrappedObj.getValue(propertyName) == null) {
+                    wrappedObj.setValue(propertyName, value);
+                } else {
+                    throw new AmbiguousMapAAIException(
+                            "cannot determine where key/value goes: " + propertyName + "/" + value);
+                }
 
-	private URI uri = null;
+                if (wrappedObj.getMetadata(ObjectMetadata.NAMESPACE) != null) {
+                    if (topLevelType == null) {
+                        topLevelType = objectType;
+                    } else if (!topLevelType.equals(objectType)) {
+                        throw new AmbiguousMapAAIException(
+                                "found two top level nodes of different types: " + topLevelType + " and " + objectType);
+                    }
+                }
+            } catch (AAIUnknownObjectException e) {
+                throw new AAIIdentityMapParseException("invalid object name in map: " + objectType, e);
+            }
 
-	private SchemaVersions schemaVersions;
-	
-	/**
-	 * Instantiates a new relationship to URI.
-	 *
-	 * @param loader the loader
-	 * @param relationship the relationship
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public RelationshipToURI(Loader loader, Introspector relationship) throws UnsupportedEncodingException, AAIException {
-		this.relationship = relationship;
-		this.modelType = relationship.getModelType();
-		this.loader = loader;
-		this.initEdgeIngestor();
-		this.parse();
-		
-	}
+        }
+        if (!map.isEmpty()) {
+            String startType = (String) relationship.getValue("related-to");
+            List nodeTypes = new ArrayList<>();
+            nodeTypes.addAll(map.keySet());
 
-	protected void initEdgeIngestor() {
-		//TODO proper spring wiring, but that requires a lot of refactoring so for now we have this
-		ApplicationContext ctx = SpringContextAware.getApplicationContext();
-		edgeRules = ctx.getBean(EdgeIngestor.class);
-		schemaVersions = (SchemaVersions) ctx.getBean("schemaVersions");
-	}
+            String displacedType;
+            for (int i = 0; i < nodeTypes.size(); i++) {
+                if (nodeTypes.get(i).equals(startType)) {
+                    displacedType = nodeTypes.set(nodeTypes.size() - 1, startType);
+                    nodeTypes.set(i, displacedType);
+                    break;
+                }
+            }
+            sortRelationships(nodeTypes, startType, 1);
+            int startTypeIndex = nodeTypes.indexOf(startType);
+            int topLevelIndex = 0;
+            if (topLevelType != null) {
+                topLevelIndex = nodeTypes.indexOf(topLevelType);
+            }
+            // remove additional types not needed if they are there
+            List nodeTypesSubList = nodeTypes;
+            if (topLevelIndex != 0) {
+                nodeTypesSubList = nodeTypes.subList(topLevelIndex, startTypeIndex + 1);
+            }
+            for (String type : nodeTypesSubList) {
+                uriBuilder.append(map.get(type).getURI());
+            }
+            if (!nodeTypesSubList.isEmpty()) {
+                result = Optional.of(UriBuilder.fromPath(uriBuilder.toString()).build());
+            }
+        }
+        return result;
+    }
 
-	/**
-	 * Parses the.
-	 * @throws  
-	 *
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	protected void parse() throws AAIException {
-		String relatedLink = (String)relationship.getValue("related-link");
-		Optional result;
-		try {
-			if (loader.getVersion().compareTo(schemaVersions.getRelatedLinkVersion()) >= 0) {
-				result = processRelatedLink(relatedLink);
-				if (!result.isPresent()) {
-					result = processRelationshipData();
-				}
-			} else {
-				result = processRelationshipData();
-				if (!result.isPresent()) {
-					result = processRelatedLink(relatedLink);
-				}
-			}
-			if (result.isPresent()) {
-				this.uri = result.get();
-			} else {
-				throw new AAIIdentityMapParseException("nothing to parse");
-			}
-		} catch (AAIException e) { 
-			throw e;
-		} catch (Exception e) {
-			throw new AAIIdentityMapParseException("Could not parse relationship-list object: " + e.getMessage(), e);
-		}
+    private Optional processRelatedLink(String relatedLink)
+            throws URISyntaxException, UnsupportedEncodingException, AAIIdentityMapParseException {
+        Optional result = Optional.empty();
+        if (relatedLink != null) {
+            URI resultUri = new URI(relatedLink);
+            String path = resultUri.toString();
+            resultUri = UriBuilder.fromPath(resultUri.getRawPath()).build();
+            URIParser uriParser = new URIParser(this.loader, resultUri);
+            try {
+                uriParser.validate();
+            } catch (AAIException e) {
+                throw new AAIIdentityMapParseException("related link is invalid: " + relatedLink, e);
+            }
+            result = Optional.of(resultUri);
+        }
 
-	}
+        return result;
+    }
 
-	private Optional processRelationshipData() throws AAIException, UnsupportedEncodingException {
-		Optional result = Optional.empty();
-		StringBuilder uriBuilder = new StringBuilder();
-		List data = (List)relationship.getValue("relationship-data");
-		Introspector wrapper;
-		String key;
-		String value;
-		String objectType;
-		String propertyName;
-		String topLevelType = null;
-		String[] split;
-		HashMap map = new HashMap<>();
-		for (Object datum : data) {
-			wrapper = IntrospectorFactory.newInstance(modelType, datum);
-			key = (String)wrapper.getValue("relationship-key");
-			value = (String)wrapper.getValue("relationship-value");
-			split = key.split("\\.");
-			if (split == null || split.length != 2) {
-				throw new AAIIdentityMapParseException("incorrect format for key must be of the form {node-type}.{property-name}");
-			}
-			//check node name ok
-			//check prop name ok
-			objectType = split[0];
-			propertyName = split[1];
+    /**
+     * Sort relationships.
+     *
+     * @param data the data
+     * @param startType the start type
+     * @param i the i
+     * @return true, if successful
+     * @throws AAIException
+     */
+    private boolean sortRelationships(List data, String startType, int i) throws AAIException {
 
-			try {
-				Introspector wrappedObj = loader.introspectorFromName(objectType);
+        if (i == data.size()) {
+            return true;
+        }
+        int j;
+        String objectType;
+        String displacedObject;
+        EdgeRule rule;
+        Direction direction;
+        for (j = (data.size() - i) - 1; j >= 0; j--) {
+            objectType = data.get(j);
+            try {
+                rule = edgeRules
+                        .getRule(new EdgeRuleQuery.Builder(startType, objectType).edgeType(EdgeType.TREE).build());
+                direction = rule.getDirection();
+                if (direction != null) {
+                    if ((rule.getContains().equals(AAIDirection.OUT.toString()) && direction.equals(Direction.IN))
+                            || (rule.getContains().equals(AAIDirection.IN.toString())
+                                    && direction.equals(Direction.OUT))) {
+                        displacedObject = data.set((data.size() - i) - 1, data.get(j));
+                        data.set(j, displacedObject);
+                        if (sortRelationships(data, objectType, i + 1)) {
+                            return true;
+                        } else {
+                            // continue to process
+                        }
+                    }
+                }
+            } catch (AAIException | EdgeRuleNotFoundException | AmbiguousRuleChoiceException e) {
+                // ignore exceptions generated
+                continue;
+            }
+        }
 
-				if (!wrappedObj.hasProperty(propertyName)) {
-					throw new AAIIdentityMapParseException("invalid property name in map: " + propertyName);
-				}
-				if (map.containsKey(objectType)) {
-					wrappedObj = map.get(objectType);
-				} else {
-					map.put(objectType, wrappedObj);
-				}
-				if (wrappedObj.getValue(propertyName) == null) {
-					wrappedObj.setValue(propertyName, value);
-				} else {
-					throw new AmbiguousMapAAIException("cannot determine where key/value goes: " + propertyName + "/" + value);
-				}
-				
-				if (wrappedObj.getMetadata(ObjectMetadata.NAMESPACE) != null) {
-					if (topLevelType == null) {
-						topLevelType = objectType;
-					} else if (!topLevelType.equals(objectType)){
-						throw new AmbiguousMapAAIException("found two top level nodes of different types: " + topLevelType + " and " + objectType);
-					}
-				}
-			} catch (AAIUnknownObjectException e) {
-				throw new AAIIdentityMapParseException("invalid object name in map: " + objectType, e);
-			}
-			
-		}
-		if (!map.isEmpty()) {
-			String startType = (String)relationship.getValue("related-to");
-			List nodeTypes = new ArrayList<>();
-			nodeTypes.addAll(map.keySet());
-			
-			String displacedType;
-			for (int i = 0; i < nodeTypes.size(); i++) {
-				if (nodeTypes.get(i).equals(startType)) {
-					displacedType = nodeTypes.set(nodeTypes.size() - 1, startType);
-					nodeTypes.set(i, displacedType);
-					break;
-				}
-			}
-			sortRelationships(nodeTypes, startType, 1);
-			int startTypeIndex = nodeTypes.indexOf(startType);
-			int topLevelIndex = 0;
-			if (topLevelType != null) {
-				topLevelIndex = nodeTypes.indexOf(topLevelType);
-			}
-			//remove additional types not needed if they are there
-			List nodeTypesSubList = nodeTypes;
-			if (topLevelIndex != 0) {
-				nodeTypesSubList = nodeTypes.subList(topLevelIndex, startTypeIndex+1);
-			}
-			for (String type : nodeTypesSubList) {
-				uriBuilder.append(map.get(type).getURI());
-			}
-			if (!nodeTypesSubList.isEmpty()) {
-				result = Optional.of(UriBuilder.fromPath(uriBuilder.toString()).build());
-			}
-		}
-		return result;
-	}
+        return false;
+    }
 
-	private Optional processRelatedLink(String relatedLink) throws URISyntaxException, UnsupportedEncodingException, AAIIdentityMapParseException  {
-		Optional result = Optional.empty();
-		if (relatedLink != null) {
-			URI resultUri = new URI(relatedLink);
-			String path = resultUri.toString();
-			resultUri = UriBuilder.fromPath(resultUri.getRawPath()).build();
-			URIParser uriParser = new URIParser(this.loader, resultUri);
-			try {
-				uriParser.validate();
-			} catch (AAIException e) {
-				throw new AAIIdentityMapParseException("related link is invalid: " + relatedLink, e);
-			}
-			result = Optional.of(resultUri);
-		}
-		
-		return result;
-	}
-	
-	/**
-	 * Sort relationships.
-	 *
-	 * @param data the data
-	 * @param startType the start type
-	 * @param i the i
-	 * @return true, if successful
-	 * @throws AAIException 
-	 */
-	private boolean sortRelationships(List data, String startType, int i) throws AAIException {
-	
-		if (i == data.size()) {
-			return true;
-		}
-		int j;
-		String objectType;
-		String displacedObject;
-		EdgeRule rule;
-		Direction direction;
-		for (j = (data.size() - i) - 1; j >= 0; j--) {
-			objectType = data.get(j);
-			try {
-				rule = edgeRules.getRule(new EdgeRuleQuery.Builder(startType, objectType).edgeType(EdgeType.TREE).build());
-				direction = rule.getDirection();
-				if (direction != null) {
-					if ((rule.getContains().equals(AAIDirection.OUT.toString()) && direction.equals(Direction.IN)) || (rule.getContains().equals(AAIDirection.IN.toString()) && direction.equals(Direction.OUT))) {
-						displacedObject = data.set((data.size() - i) - 1, data.get(j));
-						data.set(j, displacedObject);
-						if (sortRelationships(data, objectType, i+1)) {
-							return true;
-						} else {
-							//continue to process
-						}
-					}
-				}
-			} catch (AAIException | EdgeRuleNotFoundException | AmbiguousRuleChoiceException e ) {
-				//ignore exceptions generated
-				continue;
-			}
-		}
-		
+    /**
+     * Gets the uri.
+     *
+     * @return the uri
+     */
+    public URI getUri() {
+        return uri;
+    }
 
-		return false;
-	}
-	
-	/**
-	 * Gets the uri.
-	 *
-	 * @return the uri
-	 */
-	public URI getUri() {
-		return uri;
-	}
-	
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/Parsable.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/Parsable.java
index f35b4fde..3bc40fd3 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/Parsable.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/Parsable.java
@@ -17,55 +17,58 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
-import org.onap.aai.edges.enums.EdgeType;
-
-import javax.ws.rs.core.MultivaluedMap;
 
 /**
  * The Interface Parsable.
  */
 public interface Parsable {
 
-	/**
-	 * 
-	 * @param obj
-	 * @param type
-	 * @param uriKeys
-	 * @throws AAIException
-	 */
-	void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys) throws AAIException;
-	/**
-	 * Process container.
-	 *
-	 * @param obj the obj
-	 * @param uriKeys the uri keys
-	 * @param isFinalContainer the is final container
-	 * @throws AAIException the AAI exception
-	 */
-	void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys, boolean isFinalContainer) throws AAIException;
+    /**
+     * 
+     * @param obj
+     * @param type
+     * @param uriKeys
+     * @throws AAIException
+     */
+    void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys) throws AAIException;
+
+    /**
+     * Process container.
+     *
+     * @param obj the obj
+     * @param uriKeys the uri keys
+     * @param isFinalContainer the is final container
+     * @throws AAIException the AAI exception
+     */
+    void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException;
+
+    /**
+     * Process namespace.
+     *
+     * @param obj the obj
+     */
+    void processNamespace(Introspector obj);
 
-	/**
-	 * Process namespace.
-	 *
-	 * @param obj the obj
-	 */
-	void processNamespace(Introspector obj);
+    /**
+     * Gets the cloud region transform.
+     *
+     * @return the cloud region transform
+     */
+    String getCloudRegionTransform();
 
-	/**
-	 * Gets the cloud region transform.
-	 *
-	 * @return the cloud region transform
-	 */
-	String getCloudRegionTransform();
-	
-	/**
-	 * Use original loader.
-	 *
-	 * @return true, if successful
-	 */
-	boolean useOriginalLoader();
+    /**
+     * Use original loader.
+     *
+     * @return true, if successful
+     */
+    boolean useOriginalLoader();
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIParser.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIParser.java
index 5aece21c..d8f401ee 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIParser.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIParser.java
@@ -17,258 +17,263 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.util.Set;
+
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriBuilder;
+
 import org.onap.aai.config.SpringContextAware;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.introspection.LoaderFactory;
-import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.logging.ErrorLogHelper;
 import org.onap.aai.parsers.exceptions.DoesNotStartWithValidNamespaceException;
 import org.onap.aai.rest.RestTokens;
 import org.onap.aai.schema.enums.ObjectMetadata;
-import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.util.AAIConfig;
 import org.springframework.web.util.UriUtils;
 
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriBuilder;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.util.Set;
-
-
 /**
  * The Class URIParser.
  */
 public class URIParser {
-	
-	private URI uri = null;
-
-	protected Loader loader = null;
-	
-	protected Loader originalLoader = null;
-	
-	private URI originalURI = null;
-	
-	private MultivaluedMap queryParams = null;
-	
-	
-	/**
-	 * Instantiates a new URI parser.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 */
-	public URIParser(Loader loader, URI uri) {
-		this.uri = uri;
-
-		this.originalLoader = loader;
-		//Load the latest version because we need it for cloud region
-
-			this.loader = loader;
-	}
-	
-	/**
-	 * Instantiates a new URI parser.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 * @param queryParams the query params
-	 */
-	public URIParser(Loader loader, URI uri, MultivaluedMap queryParams) {
-		this(loader, uri);
-		this.queryParams = queryParams;
-	}
-
-	public Loader getLoader() {
-		
-		return this.loader;
-		
-	}
-	
-	/**
-	 * Gets the original URI.
-	 *
-	 * @return the original URI
-	 */
-	public URI getOriginalURI() {
-		return this.originalURI;
-	}
-	
-	/**
-	 * Parses the.
-	 *
-	 * @param p the p
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public void parse(Parsable p) throws UnsupportedEncodingException, AAIException {
-		try {
-			boolean isRelative = false;
-			uri = this.trimURI(uri);
-			uri = handleCloudRegion(p.getCloudRegionTransform(), uri);
-			if (p.useOriginalLoader()) {
-				this.loader = this.originalLoader;
-			}
-			this.originalURI  = UriBuilder.fromPath(uri.getRawPath()).build();
-			if (uri.getRawPath().startsWith("./")) {
-				uri = new URI(uri.getRawPath().replaceFirst("\\./", ""));
-				isRelative = true;
-			}
-			String[] parts = uri.getRawPath().split("/");
-			Introspector validNamespaces = loader.introspectorFromName("inventory");
-			Set keys = null;
-			String part = "";
-			Introspector previousObj = null;
-			EdgeType type = EdgeType.TREE;
-			for (int i = 0; i < parts.length;) {
-				part = parts[i];
-				Introspector introspector = null;
-				if (part.equals(RestTokens.COUSIN.toString())) {
-					if (i == parts.length-1) {
-						throw new AAIException("AAI_3000", uri + " not a valid path. Cannot end in " + RestTokens.COUSIN);
-					}
-					introspector = loader.introspectorFromName(parts[i+1]);
-					if(null == previousObj) {
-						throw new AAIException("AAI_3001");
-					}
-					if (previousObj.isContainer() && introspector.isContainer()) {
-						throw new AAIException("AAI_3000", uri + " not a valid path. Cannot chain plurals together");
-					}
-					MultivaluedMap uriKeys = new MultivaluedHashMap<>();
-					if (i == parts.length-2 && queryParams != null) {
-						Set queryKeys = queryParams.keySet();
-						for (String key : queryKeys) {
-							uriKeys.put(key, queryParams.get(key));
-							
-						}
-					}
-					if (introspector.isContainer()) {
-						boolean isFinalContainer = i == parts.length-2;
-						/*
-						 * Related-to could be COUSIN OR TREE and in some cases BOTH. So Let EdgeRuleBuilder use all the edgeTypes
-						 */
-						p.processContainer(introspector, EdgeType.ALL, uriKeys, isFinalContainer);
-					}
-					previousObj = introspector;
-					type = EdgeType.ALL;
-					i+=2;
-					continue;
-				}
-				introspector = loader.introspectorFromName(part);
-				if (introspector != null) {
-					
-					//previous has current as property
-					if (previousObj != null && !previousObj.hasChild(introspector) && !previousObj.getDbName().equals("nodes")) {
-						throw new AAIException("AAI_3001", uri + " not a valid path. " + part + " not valid");
-					} else if (previousObj == null) {
-						String abstractType = introspector.getMetadata(ObjectMetadata.ABSTRACT);
-						if (abstractType == null) {
-							abstractType = "";
-						}
-						//first time through, make sure it starts from a namespace
-						//ignore abstract types
-						if (!isRelative && !abstractType.equals("true") && !validNamespaces.hasChild(introspector)) {
-							throw new DoesNotStartWithValidNamespaceException( uri + " not a valid path. It does not start from a valid namespace");
-						}
-					}
-					
-					keys = introspector.getKeys();
-					if (keys.size() > 0) {
-						MultivaluedMap uriKeys = new MultivaluedHashMap<>();
-						i++;
-						if (i == parts.length && queryParams != null) {
-							Set queryKeys = queryParams.keySet();
-							for (String key : queryKeys) {
-								uriKeys.put(key, queryParams.get(key));
-							}
-						} else {
-							for (String key : keys) {
-								part =  UriUtils.decode(parts[i], "UTF-8");
-								
-								introspector.setValue(key, part);
-								
-								//skip this for further processing
-								i++;
-							}
-						}
-						
-						p.processObject(introspector, type, uriKeys);
-						type = EdgeType.TREE;
-					} else if (introspector.isContainer()) {
-						boolean isFinalContainer = i == parts.length-1;
-						MultivaluedMap uriKeys = new MultivaluedHashMap<>();
-						
-						if (isFinalContainer && queryParams != null) {
-							Set queryKeys = queryParams.keySet();
-							for (String key : queryKeys) {
-								uriKeys.put(key, queryParams.get(key));
-								
-							}
-						}
-						p.processContainer(introspector, type, uriKeys, isFinalContainer);
-						i++; 
-					} else {
-						p.processNamespace(introspector);
-						//namespace case
-						i++;
-					}
-					previousObj = introspector;
-				} else {
-					//invalid item found should log
-					//original said bad path
-					throw new AAIException("AAI_3001", "invalid item found in path: " + part);
-				}
-			}
-		} catch (AAIException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new AAIException("AAI_3001", e);
-		}
-	}
-	
-	public boolean validate() throws UnsupportedEncodingException, AAIException {
-		this.parse(new URIValidate());
-		return true;
-	}
-	/**
-	 * Handle cloud region.
-	 *
-	 * @param action the action
-	 * @param uri the uri
-	 * @return the uri
-	 */
-	protected URI handleCloudRegion(String action, URI uri) {
-
-			return uri;
-
-	}
-	
-	/**
-	 * Trim URI.
-	 *
-	 * @param uri the uri
-	 * @return the uri
-	 */
-	protected URI trimURI(URI uri) {
-		
-		String result = uri.getRawPath();
-		if (result.startsWith("/")) {
-			result = result.substring(1, result.length());
-		}
-		
-		if (result.endsWith("/")) {
-			result = result.substring(0, result.length() - 1);
-		}
-
-		// TODO - Check if this makes to do for model driven for base uri path
-		result = result.replaceFirst("[a-z][a-z]*/v\\d+/", "");
-		
-		return UriBuilder.fromPath(result).build();
-	}
+
+    private URI uri = null;
+
+    protected Loader loader = null;
+
+    protected Loader originalLoader = null;
+
+    private URI originalURI = null;
+
+    private MultivaluedMap queryParams = null;
+
+    /**
+     * Instantiates a new URI parser.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     */
+    public URIParser(Loader loader, URI uri) {
+        this.uri = uri;
+
+        this.originalLoader = loader;
+        // Load the latest version because we need it for cloud region
+
+        this.loader = loader;
+    }
+
+    /**
+     * Instantiates a new URI parser.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     * @param queryParams the query params
+     */
+    public URIParser(Loader loader, URI uri, MultivaluedMap queryParams) {
+        this(loader, uri);
+        this.queryParams = queryParams;
+    }
+
+    public Loader getLoader() {
+
+        return this.loader;
+
+    }
+
+    /**
+     * Gets the original URI.
+     *
+     * @return the original URI
+     */
+    public URI getOriginalURI() {
+        return this.originalURI;
+    }
+
+    /**
+     * Parses the.
+     *
+     * @param p the p
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public void parse(Parsable p) throws UnsupportedEncodingException, AAIException {
+        try {
+            boolean isRelative = false;
+            uri = this.trimURI(uri);
+            uri = handleCloudRegion(p.getCloudRegionTransform(), uri);
+            if (p.useOriginalLoader()) {
+                this.loader = this.originalLoader;
+            }
+            this.originalURI = UriBuilder.fromPath(uri.getRawPath()).build();
+            if (uri.getRawPath().startsWith("./")) {
+                uri = new URI(uri.getRawPath().replaceFirst("\\./", ""));
+                isRelative = true;
+            }
+            String[] parts = uri.getRawPath().split("/");
+            Introspector validNamespaces = loader.introspectorFromName("inventory");
+            Set keys = null;
+            String part = "";
+            Introspector previousObj = null;
+            EdgeType type = EdgeType.TREE;
+            for (int i = 0; i < parts.length;) {
+                part = parts[i];
+                Introspector introspector = null;
+                if (part.equals(RestTokens.COUSIN.toString())) {
+                    if (i == parts.length - 1) {
+                        throw new AAIException("AAI_3000",
+                                uri + " not a valid path. Cannot end in " + RestTokens.COUSIN);
+                    }
+                    introspector = loader.introspectorFromName(parts[i + 1]);
+                    if (null == previousObj) {
+                        throw new AAIException("AAI_3001");
+                    }
+                    if (previousObj.isContainer() && introspector.isContainer()) {
+                        throw new AAIException("AAI_3000", uri + " not a valid path. Cannot chain plurals together");
+                    }
+                    MultivaluedMap uriKeys = new MultivaluedHashMap<>();
+                    if (i == parts.length - 2 && queryParams != null) {
+                        Set queryKeys = queryParams.keySet();
+                        for (String key : queryKeys) {
+                            uriKeys.put(key, queryParams.get(key));
+
+                        }
+                    }
+                    if (introspector.isContainer()) {
+                        boolean isFinalContainer = i == parts.length - 2;
+                        /*
+                         * Related-to could be COUSIN OR TREE and in some cases BOTH. So Let EdgeRuleBuilder use all the
+                         * edgeTypes
+                         */
+                        p.processContainer(introspector, EdgeType.ALL, uriKeys, isFinalContainer);
+                    }
+                    previousObj = introspector;
+                    type = EdgeType.ALL;
+                    i += 2;
+                    continue;
+                }
+                introspector = loader.introspectorFromName(part);
+                if (introspector != null) {
+
+                    // previous has current as property
+                    if (previousObj != null && !previousObj.hasChild(introspector)
+                            && !previousObj.getDbName().equals("nodes")) {
+                        throw new AAIException("AAI_3001", uri + " not a valid path. " + part + " not valid");
+                    } else if (previousObj == null) {
+                        String abstractType = introspector.getMetadata(ObjectMetadata.ABSTRACT);
+                        if (abstractType == null) {
+                            abstractType = "";
+                        }
+                        // first time through, make sure it starts from a namespace
+                        // ignore abstract types
+                        if (!isRelative && !abstractType.equals("true") && !validNamespaces.hasChild(introspector)) {
+                            throw new DoesNotStartWithValidNamespaceException(
+                                    uri + " not a valid path. It does not start from a valid namespace");
+                        }
+                    }
+
+                    keys = introspector.getKeys();
+                    if (keys.size() > 0) {
+                        MultivaluedMap uriKeys = new MultivaluedHashMap<>();
+                        i++;
+                        if (i == parts.length && queryParams != null) {
+                            Set queryKeys = queryParams.keySet();
+                            for (String key : queryKeys) {
+                                uriKeys.put(key, queryParams.get(key));
+                            }
+                        } else {
+                            for (String key : keys) {
+                                part = UriUtils.decode(parts[i], "UTF-8");
+
+                                introspector.setValue(key, part);
+
+                                // skip this for further processing
+                                i++;
+                            }
+                        }
+
+                        p.processObject(introspector, type, uriKeys);
+                        type = EdgeType.TREE;
+                    } else if (introspector.isContainer()) {
+                        boolean isFinalContainer = i == parts.length - 1;
+                        MultivaluedMap uriKeys = new MultivaluedHashMap<>();
+
+                        if (isFinalContainer && queryParams != null) {
+                            Set queryKeys = queryParams.keySet();
+                            for (String key : queryKeys) {
+                                uriKeys.put(key, queryParams.get(key));
+
+                            }
+                        }
+                        p.processContainer(introspector, type, uriKeys, isFinalContainer);
+                        i++;
+                    } else {
+                        p.processNamespace(introspector);
+                        // namespace case
+                        i++;
+                    }
+                    previousObj = introspector;
+                } else {
+                    // invalid item found should log
+                    // original said bad path
+                    throw new AAIException("AAI_3001", "invalid item found in path: " + part);
+                }
+            }
+        } catch (AAIException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new AAIException("AAI_3001", e);
+        }
+    }
+
+    public boolean validate() throws UnsupportedEncodingException, AAIException {
+        this.parse(new URIValidate());
+        return true;
+    }
+
+    /**
+     * Handle cloud region.
+     *
+     * @param action the action
+     * @param uri the uri
+     * @return the uri
+     */
+    protected URI handleCloudRegion(String action, URI uri) {
+
+        return uri;
+
+    }
+
+    /**
+     * Trim URI.
+     *
+     * @param uri the uri
+     * @return the uri
+     */
+    protected URI trimURI(URI uri) {
+
+        String result = uri.getRawPath();
+        if (result.startsWith("/")) {
+            result = result.substring(1, result.length());
+        }
+
+        if (result.endsWith("/")) {
+            result = result.substring(0, result.length() - 1);
+        }
+
+        // TODO - Check if this makes to do for model driven for base uri path
+        result = result.replaceFirst("[a-z][a-z]*/v\\d+/", "");
+
+        return UriBuilder.fromPath(result).build();
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToDBKey.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToDBKey.java
index 007f1b3c..ae0b4911 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToDBKey.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToDBKey.java
@@ -17,20 +17,23 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
 import com.google.common.base.Joiner;
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.introspection.Loader;
-import org.onap.aai.edges.enums.EdgeType;
 
-import javax.ws.rs.core.MultivaluedMap;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+
 /**
  * Creates a Unique database key from a URI
  * 
@@ -38,69 +41,69 @@ import java.util.List;
  */
 public class URIToDBKey implements Parsable {
 
-	
-	private List dbKeys = new ArrayList<>();
-
-	/**
-	 * Instantiates a new URI to DB key.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws AAIException the AAI exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 */
-	public URIToDBKey(Loader loader, URI uri) throws IllegalArgumentException, AAIException, UnsupportedEncodingException {
-		URIParser parser = new URIParser(loader, uri);
-		parser.parse(this);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processNamespace(Introspector obj) {
-	
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String getCloudRegionTransform() {
-		return "add";
-	}
-	
-	/**
-	 * Gets the result.
-	 *
-	 * @return the result
-	 */
-	public Object getResult() {
-		return Joiner.on("/").join(this.dbKeys);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public boolean useOriginalLoader() {
-		return false;
-	}
-
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
-			throws AAIException {
-
-		dbKeys.add(obj.getDbName());
-
-		for (String key : uriKeys.keySet()) {
-			dbKeys.add(uriKeys.getFirst(key).toString());
-		}		
-	}
-
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
-			boolean isFinalContainer) {
-	}
+    private List dbKeys = new ArrayList<>();
+
+    /**
+     * Instantiates a new URI to DB key.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     * @throws IllegalArgumentException the illegal argument exception
+     * @throws AAIException the AAI exception
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     */
+    public URIToDBKey(Loader loader, URI uri)
+            throws IllegalArgumentException, AAIException, UnsupportedEncodingException {
+        URIParser parser = new URIParser(loader, uri);
+        parser.parse(this);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processNamespace(Introspector obj) {
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String getCloudRegionTransform() {
+        return "add";
+    }
+
+    /**
+     * Gets the result.
+     *
+     * @return the result
+     */
+    public Object getResult() {
+        return Joiner.on("/").join(this.dbKeys);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public boolean useOriginalLoader() {
+        return false;
+    }
+
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
+            throws AAIException {
+
+        dbKeys.add(obj.getDbName());
+
+        for (String key : uriKeys.keySet()) {
+            dbKeys.add(uriKeys.getFirst(key).toString());
+        }
+    }
+
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) {
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToExtensionInformation.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToExtensionInformation.java
index 1ecb3b4c..f3da24c3 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToExtensionInformation.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToExtensionInformation.java
@@ -17,154 +17,158 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
 import com.google.common.base.CaseFormat;
 import com.google.common.base.Joiner;
-import org.onap.aai.exceptions.AAIException;
-import org.onap.aai.introspection.Introspector;
-import org.onap.aai.introspection.Loader;
-import org.onap.aai.restcore.HttpMethod;
-import org.onap.aai.edges.enums.EdgeType;
 
-import javax.ws.rs.core.MultivaluedMap;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.restcore.HttpMethod;
+
 /**
  * The Class URIToExtensionInformation.
  */
 public class URIToExtensionInformation implements Parsable {
 
-	private String namespace = "";
-	
-	private String methodName = "";
-	
-	private String topObject = "";
-	
-	private List pieces = null;
-	
-	/**
-	 * Instantiates a new URI to extension information.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws AAIException the AAI exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 */
-	public URIToExtensionInformation(Loader loader, URI uri) throws IllegalArgumentException, AAIException, UnsupportedEncodingException {
-		pieces = new ArrayList<>();
-		URIParser parser = new URIParser(loader, uri);
-		parser.parse(this);
-		
-		this.methodName = Joiner.on("").join(this.pieces);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processNamespace(Introspector obj) {
-		this.namespace = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, obj.getDbName());
-		pieces.add(toUpperCamel(obj.getDbName()));
-
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String getCloudRegionTransform() {
-		return "remove";
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public boolean useOriginalLoader() {
-		return true;
-	}
-	
-	/**
-	 * Gets the namespace.
-	 *
-	 * @return the namespace
-	 */
-	public String getNamespace() {
-		return this.namespace;
-	}
-	
-	/**
-	 * Gets the top object.
-	 *
-	 * @return the top object
-	 */
-	public String getTopObject() {
-		return this.topObject;
-	}
-	
-	/**
-	 * Gets the method name.
-	 *
-	 * @param httpMethod the http method
-	 * @param isPreprocess the is preprocess
-	 * @return the method name
-	 */
-	public String getMethodName(HttpMethod httpMethod, boolean isPreprocess) {
-		String result = "Dynamic";
-		/*
-		if (httpMethod.equals(HttpMethod.PUT) || httpMethod.equals(HttpMethod.PUT_EDGE)) {
-			result += "Add";
-		}
-		*/
-		if (httpMethod.equals(HttpMethod.PUT) ) {
-			result += "Add";
-		} else if  (httpMethod.equals(HttpMethod.PUT_EDGE)) {
-			result += "AddEdge";
-		} else if (httpMethod.equals(HttpMethod.DELETE)) {
-			result += "Del";
-		} else {
-			throw new IllegalArgumentException("http method not supported: " + httpMethod);
-		}
-		result += this.methodName;
-		
-		if (isPreprocess) {
-			result += "PreProc";
-		} else {
-			result += "PostProc";
-		}
-		return result;
-	}
-
-	/**
-	 * To upper camel.
-	 *
-	 * @param name the name
-	 * @return the string
-	 */
-	private String toUpperCamel(String name) {
-		String result = "";
-		result = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, name);
-		return result;
-	}
-
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
-			throws AAIException {
-		String upperCamel = toUpperCamel(obj.getDbName());
-		if (topObject.equals("")) {
-			topObject = upperCamel;
-		}
-		pieces.add(upperCamel);
-	}
-
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
-			boolean isFinalContainer) throws AAIException {
-		pieces.add(toUpperCamel(obj.getName()));
-	}
+    private String namespace = "";
+
+    private String methodName = "";
+
+    private String topObject = "";
+
+    private List pieces = null;
+
+    /**
+     * Instantiates a new URI to extension information.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     * @throws IllegalArgumentException the illegal argument exception
+     * @throws AAIException the AAI exception
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     */
+    public URIToExtensionInformation(Loader loader, URI uri)
+            throws IllegalArgumentException, AAIException, UnsupportedEncodingException {
+        pieces = new ArrayList<>();
+        URIParser parser = new URIParser(loader, uri);
+        parser.parse(this);
+
+        this.methodName = Joiner.on("").join(this.pieces);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processNamespace(Introspector obj) {
+        this.namespace = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, obj.getDbName());
+        pieces.add(toUpperCamel(obj.getDbName()));
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String getCloudRegionTransform() {
+        return "remove";
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public boolean useOriginalLoader() {
+        return true;
+    }
+
+    /**
+     * Gets the namespace.
+     *
+     * @return the namespace
+     */
+    public String getNamespace() {
+        return this.namespace;
+    }
+
+    /**
+     * Gets the top object.
+     *
+     * @return the top object
+     */
+    public String getTopObject() {
+        return this.topObject;
+    }
+
+    /**
+     * Gets the method name.
+     *
+     * @param httpMethod the http method
+     * @param isPreprocess the is preprocess
+     * @return the method name
+     */
+    public String getMethodName(HttpMethod httpMethod, boolean isPreprocess) {
+        String result = "Dynamic";
+        /*
+         * if (httpMethod.equals(HttpMethod.PUT) || httpMethod.equals(HttpMethod.PUT_EDGE)) {
+         * result += "Add";
+         * }
+         */
+        if (httpMethod.equals(HttpMethod.PUT)) {
+            result += "Add";
+        } else if (httpMethod.equals(HttpMethod.PUT_EDGE)) {
+            result += "AddEdge";
+        } else if (httpMethod.equals(HttpMethod.DELETE)) {
+            result += "Del";
+        } else {
+            throw new IllegalArgumentException("http method not supported: " + httpMethod);
+        }
+        result += this.methodName;
+
+        if (isPreprocess) {
+            result += "PreProc";
+        } else {
+            result += "PostProc";
+        }
+        return result;
+    }
+
+    /**
+     * To upper camel.
+     *
+     * @param name the name
+     * @return the string
+     */
+    private String toUpperCamel(String name) {
+        String result = "";
+        result = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, name);
+        return result;
+    }
+
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
+            throws AAIException {
+        String upperCamel = toUpperCamel(obj.getDbName());
+        if (topObject.equals("")) {
+            topObject = upperCamel;
+        }
+        pieces.add(upperCamel);
+    }
+
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException {
+        pieces.add(toUpperCamel(obj.getName()));
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToObject.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToObject.java
index d8bdab83..186f2ee9 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToObject.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToObject.java
@@ -17,21 +17,23 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.schema.enums.ObjectMetadata;
-import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.setup.SchemaVersion;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.List;
-
 /**
  * Given a URI this class returns an object, or series of nested objects
  * with their keys populated based off the values in the URI.
@@ -40,177 +42,181 @@ import java.util.List;
  */
 public class URIToObject implements Parsable {
 
-	
-	private Introspector topEntity = null;
-	
-	private String topEntityName = null;
-	
-	private String entityName = null;
-	
-	private Introspector entity = null;
-	
-	private Introspector previous = null;
-	
-	private List parentList = null;
-	
-	private SchemaVersion version = null;
-	private Loader loader = null;
-	private final HashMap relatedObjects;
-	
-	/**
-	 * Instantiates a new URI to object.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws AAIException the AAI exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 */
-	public URIToObject(Loader loader, URI uri) throws AAIException, UnsupportedEncodingException {
-		
-		URIParser parser = new URIParser(loader, uri);
-		this.relatedObjects = new HashMap<>();
-		
-		parser.parse(this);
-		this.loader = parser.getLoader();
-		this.version = loader.getVersion();
-	}
-	public URIToObject(Loader loader, URI uri, HashMap relatedObjects) throws AAIException, UnsupportedEncodingException {
-		
-		URIParser parser = new URIParser(loader, uri);
-		this.relatedObjects = relatedObjects;
-
-		parser.parse(this);
-		this.loader = parser.getLoader();
-		this.version = loader.getVersion();
-
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processNamespace(Introspector obj) {
-	
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String getCloudRegionTransform() {
-		return "add";
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public boolean useOriginalLoader() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/**
-	 * Gets the top entity.
-	 *
-	 * @return the top entity
-	 */
-	public Introspector getTopEntity() {
-		return this.topEntity;
-	}
-	
-	/**
-	 * Gets the entity.
-	 *
-	 * @return the entity
-	 */
-	public Introspector getEntity() {
-		return this.entity;
-	}
-	
-	/**
-	 * Gets the parent list.
-	 *
-	 * @return the parent list
-	 */
-	public List getParentList() {
-		return this.parentList;
-	}
-	
-	/**
-	 * Gets the entity name.
-	 *
-	 * @return the entity name
-	 */
-	public String getEntityName() {
-		return this.entityName;
-	}
-	
-	/**
-	 * Gets the top entity name.
-	 *
-	 * @return the top entity name
-	 */
-	public String getTopEntityName() {
-		return this.topEntityName;
-	}
-	
-	/**
-	 * Gets the object version.
-	 *
-	 * @return the object version
-	 */
-	public SchemaVersion getObjectVersion() {
-		return this.loader.getVersion();
-	}
-	public Loader getLoader() {
-		return this.loader;
-	}
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
-			throws AAIException {
-
-		if (this.entityName == null) {
-			this.topEntityName = obj.getDbName();
-			this.topEntity = obj;
-		}
-		this.entityName = obj.getDbName();
-		this.entity = obj;
-		this.parentList = (List)this.previous.getValue(obj.getName());
-		this.parentList.add(entity.getUnderlyingObject());
-		
-		for (String key : uriKeys.keySet()) {
-			entity.setValue(key, uriKeys.getFirst(key));
-		}
-		try {
-			if (relatedObjects.containsKey(entity.getObjectId())) {
-				Introspector relatedObject = relatedObjects.get(entity.getObjectId());
-				String nameProp = relatedObject.getMetadata(ObjectMetadata.NAME_PROPS);
-				if (nameProp == null) {
-					nameProp = "";
-				}
-				if (nameProp != null && !nameProp.equals("")) {
-					String[] nameProps = nameProp.split(",");
-					for (String prop : nameProps) {
-						entity.setValue(prop, relatedObject.getValue(prop));
-					}
-				}
-			}
-		} catch (UnsupportedEncodingException e) {
-		}
-		this.previous = entity;
-	}
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
-			boolean isFinalContainer) throws AAIException {
-		this.previous = obj;
-
-		if (this.entity != null) {
-			this.entity.setValue(obj.getName(), obj.getUnderlyingObject());
-		} else {
-			this.entity = obj;
-			this.topEntity = obj;
-		}
-	}
+    private Introspector topEntity = null;
+
+    private String topEntityName = null;
+
+    private String entityName = null;
+
+    private Introspector entity = null;
+
+    private Introspector previous = null;
+
+    private List parentList = null;
+
+    private SchemaVersion version = null;
+    private Loader loader = null;
+    private final HashMap relatedObjects;
+
+    /**
+     * Instantiates a new URI to object.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     * @throws IllegalArgumentException the illegal argument exception
+     * @throws AAIException the AAI exception
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     */
+    public URIToObject(Loader loader, URI uri) throws AAIException, UnsupportedEncodingException {
+
+        URIParser parser = new URIParser(loader, uri);
+        this.relatedObjects = new HashMap<>();
+
+        parser.parse(this);
+        this.loader = parser.getLoader();
+        this.version = loader.getVersion();
+    }
+
+    public URIToObject(Loader loader, URI uri, HashMap relatedObjects)
+            throws AAIException, UnsupportedEncodingException {
+
+        URIParser parser = new URIParser(loader, uri);
+        this.relatedObjects = relatedObjects;
+
+        parser.parse(this);
+        this.loader = parser.getLoader();
+        this.version = loader.getVersion();
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processNamespace(Introspector obj) {
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String getCloudRegionTransform() {
+        return "add";
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public boolean useOriginalLoader() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    /**
+     * Gets the top entity.
+     *
+     * @return the top entity
+     */
+    public Introspector getTopEntity() {
+        return this.topEntity;
+    }
+
+    /**
+     * Gets the entity.
+     *
+     * @return the entity
+     */
+    public Introspector getEntity() {
+        return this.entity;
+    }
+
+    /**
+     * Gets the parent list.
+     *
+     * @return the parent list
+     */
+    public List getParentList() {
+        return this.parentList;
+    }
+
+    /**
+     * Gets the entity name.
+     *
+     * @return the entity name
+     */
+    public String getEntityName() {
+        return this.entityName;
+    }
+
+    /**
+     * Gets the top entity name.
+     *
+     * @return the top entity name
+     */
+    public String getTopEntityName() {
+        return this.topEntityName;
+    }
+
+    /**
+     * Gets the object version.
+     *
+     * @return the object version
+     */
+    public SchemaVersion getObjectVersion() {
+        return this.loader.getVersion();
+    }
+
+    public Loader getLoader() {
+        return this.loader;
+    }
+
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
+            throws AAIException {
+
+        if (this.entityName == null) {
+            this.topEntityName = obj.getDbName();
+            this.topEntity = obj;
+        }
+        this.entityName = obj.getDbName();
+        this.entity = obj;
+        this.parentList = (List) this.previous.getValue(obj.getName());
+        this.parentList.add(entity.getUnderlyingObject());
+
+        for (String key : uriKeys.keySet()) {
+            entity.setValue(key, uriKeys.getFirst(key));
+        }
+        try {
+            if (relatedObjects.containsKey(entity.getObjectId())) {
+                Introspector relatedObject = relatedObjects.get(entity.getObjectId());
+                String nameProp = relatedObject.getMetadata(ObjectMetadata.NAME_PROPS);
+                if (nameProp == null) {
+                    nameProp = "";
+                }
+                if (nameProp != null && !nameProp.equals("")) {
+                    String[] nameProps = nameProp.split(",");
+                    for (String prop : nameProps) {
+                        entity.setValue(prop, relatedObject.getValue(prop));
+                    }
+                }
+            }
+        } catch (UnsupportedEncodingException e) {
+        }
+        this.previous = entity;
+    }
+
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException {
+        this.previous = obj;
+
+        if (this.entity != null) {
+            this.entity.setValue(obj.getName(), obj.getUnderlyingObject());
+        } else {
+            this.entity = obj;
+            this.topEntity = obj;
+        }
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToRelationshipObject.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToRelationshipObject.java
index 08eca16d..57f48d4c 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToRelationshipObject.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIToRelationshipObject.java
@@ -17,150 +17,152 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.onap.aai.config.SpringContextAware;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
-import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
-import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.setup.SchemaVersion;
 import org.onap.aai.setup.SchemaVersions;
 import org.onap.aai.util.AAIConfig;
 import org.onap.aai.util.AAIConstants;
 
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-
 /**
  * Given a URI a Relationship Object is returned.
  * 
  * The relationship-data objects are created from the keys in the model.
  * The keys are processed in the order they appear in the model.
- 
  *
+ * 
  */
 public class URIToRelationshipObject implements Parsable {
-	
-	private Introspector result = null;
-			
-	private SchemaVersion originalVersion = null;
-	
-	private Introspector relationship = null;
-	
-	private Loader loader = null;
-	
-	private String baseURL; 
-	
-	private final URI uri;
-	/**
-	 * Instantiates a new URI to relationship object.
-	 *
-	 * @param loader the loader
-	 * @param uri the uri
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws AAIException the AAI exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws MalformedURLException the malformed URL exception
-	 */
-	public URIToRelationshipObject(Loader loader, URI uri) throws AAIException {
-		
-		this.loader = loader;
-		originalVersion = loader.getVersion();
-
-		try {
-			relationship = loader.introspectorFromName("relationship");
-		} catch (AAIUnknownObjectException e1) {
-			throw new RuntimeException("Fatal error - could not load relationship object!", e1);
-		}
-
-		this.baseURL = AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE);
-		this.uri = uri;
-		
-		}
-		
-	public URIToRelationshipObject(Loader loader, URI uri, String baseURL) throws AAIException {
-		this(loader, uri);
-		
-		if (baseURL != null) {
-			this.baseURL = baseURL;
-		}
-	}
-
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public String getCloudRegionTransform(){
-		return "remove";
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void processNamespace(Introspector obj) {
-	
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public boolean useOriginalLoader() {
-		return true;
-	}
-	
-	/**
-	 * Gets the result.
-	 *
-	 * @return the result
-	 * @throws AAIException 
-	 * @throws UnsupportedEncodingException 
-	 * @throws URISyntaxException 
-	 */
-	public Introspector getResult() throws UnsupportedEncodingException, AAIException, URISyntaxException {
-		URIParser parser = new URIParser(this.loader, this.uri);
-		parser.parse(this);
-		URI originalUri = parser.getOriginalURI();
-		
-		URI relatedLink = new URI(this.baseURL + this.originalVersion + "/" + originalUri);
-		SchemaVersions schemaVersions = (SchemaVersions)SpringContextAware.getBean("schemaVersions");
-		if (this.originalVersion.compareTo(schemaVersions.getRelatedLinkVersion()) >= 0) {
-			//only return the path section of the URI past v10
-			relatedLink = new URI(relatedLink.getRawPath());
-		}
-		
-		this.relationship.setValue("related-link", relatedLink.toString());
-		
-		this.result = relationship;
-		return this.result;
-	}
-
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys) {
-		for (String key : obj.getKeys()) {
-			try {
-				Introspector data = loader.introspectorFromName("relationship-data");
-				data.setValue("relationship-key", obj.getDbName() + "." + key);
-				data.setValue("relationship-value", obj.getValue(key));
-				
-				((List)relationship.getValue("relationship-data")).add(data.getUnderlyingObject());
-			} catch (AAIUnknownObjectException e) {
-				throw new RuntimeException("Fatal error - relationship-data object not found!");
-			}
-		}
-		relationship.setValue("related-to", obj.getDbName());
-	}
-
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
-			boolean isFinalContainer) throws AAIException {
-	}
+
+    private Introspector result = null;
+
+    private SchemaVersion originalVersion = null;
+
+    private Introspector relationship = null;
+
+    private Loader loader = null;
+
+    private String baseURL;
+
+    private final URI uri;
+
+    /**
+     * Instantiates a new URI to relationship object.
+     *
+     * @param loader the loader
+     * @param uri the uri
+     * @throws IllegalArgumentException the illegal argument exception
+     * @throws AAIException the AAI exception
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws MalformedURLException the malformed URL exception
+     */
+    public URIToRelationshipObject(Loader loader, URI uri) throws AAIException {
+
+        this.loader = loader;
+        originalVersion = loader.getVersion();
+
+        try {
+            relationship = loader.introspectorFromName("relationship");
+        } catch (AAIUnknownObjectException e1) {
+            throw new RuntimeException("Fatal error - could not load relationship object!", e1);
+        }
+
+        this.baseURL = AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE);
+        this.uri = uri;
+
+    }
+
+    public URIToRelationshipObject(Loader loader, URI uri, String baseURL) throws AAIException {
+        this(loader, uri);
+
+        if (baseURL != null) {
+            this.baseURL = baseURL;
+        }
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public String getCloudRegionTransform() {
+        return "remove";
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void processNamespace(Introspector obj) {
+
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public boolean useOriginalLoader() {
+        return true;
+    }
+
+    /**
+     * Gets the result.
+     *
+     * @return the result
+     * @throws AAIException
+     * @throws UnsupportedEncodingException
+     * @throws URISyntaxException
+     */
+    public Introspector getResult() throws UnsupportedEncodingException, AAIException, URISyntaxException {
+        URIParser parser = new URIParser(this.loader, this.uri);
+        parser.parse(this);
+        URI originalUri = parser.getOriginalURI();
+
+        URI relatedLink = new URI(this.baseURL + this.originalVersion + "/" + originalUri);
+        SchemaVersions schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions");
+        if (this.originalVersion.compareTo(schemaVersions.getRelatedLinkVersion()) >= 0) {
+            // only return the path section of the URI past v10
+            relatedLink = new URI(relatedLink.getRawPath());
+        }
+
+        this.relationship.setValue("related-link", relatedLink.toString());
+
+        this.result = relationship;
+        return this.result;
+    }
+
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys) {
+        for (String key : obj.getKeys()) {
+            try {
+                Introspector data = loader.introspectorFromName("relationship-data");
+                data.setValue("relationship-key", obj.getDbName() + "." + key);
+                data.setValue("relationship-value", obj.getValue(key));
+
+                ((List) relationship.getValue("relationship-data")).add(data.getUnderlyingObject());
+            } catch (AAIUnknownObjectException e) {
+                throw new RuntimeException("Fatal error - relationship-data object not found!");
+            }
+        }
+        relationship.setValue("related-to", obj.getDbName());
+    }
+
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException {
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIValidate.java b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIValidate.java
index 6af835ee..367fc578 100644
--- a/aai-core/src/main/java/org/onap/aai/parsers/uri/URIValidate.java
+++ b/aai-core/src/main/java/org/onap/aai/parsers/uri/URIValidate.java
@@ -17,46 +17,47 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.parsers.uri;
 
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
-import org.onap.aai.edges.enums.EdgeType;
-
-import javax.ws.rs.core.MultivaluedMap;
 
 class URIValidate implements Parsable {
 
-	@Override
-	public void processNamespace(Introspector obj) {
-		//NO-OP
-		//just want to make sure this URI has valid tokens
-
-	}
-
-	@Override
-	public String getCloudRegionTransform() {
-		return "none";
-	}
-
-	@Override
-	public boolean useOriginalLoader() {
-		
-		return true;
-	}
-
-	@Override
-	public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
-			throws AAIException {
-		//NO-OP
-		//just want to make sure this URI has valid tokens
-	}
-
-	@Override
-	public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
-			boolean isFinalContainer) throws AAIException {
-		//NO-OP
-		//just want to make sure this URI has valid tokens
-	}
+    @Override
+    public void processNamespace(Introspector obj) {
+        // NO-OP
+        // just want to make sure this URI has valid tokens
+
+    }
+
+    @Override
+    public String getCloudRegionTransform() {
+        return "none";
+    }
+
+    @Override
+    public boolean useOriginalLoader() {
+
+        return true;
+    }
+
+    @Override
+    public void processObject(Introspector obj, EdgeType type, MultivaluedMap uriKeys)
+            throws AAIException {
+        // NO-OP
+        // just want to make sure this URI has valid tokens
+    }
+
+    @Override
+    public void processContainer(Introspector obj, EdgeType type, MultivaluedMap uriKeys,
+            boolean isFinalContainer) throws AAIException {
+        // NO-OP
+        // just want to make sure this URI has valid tokens
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java
index bf9dd17f..272a2c21 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java
@@ -17,8 +17,14 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+import java.util.*;
+
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -32,98 +38,93 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.edges.EdgeRule;
+import org.onap.aai.edges.EdgeRuleQuery;
+import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.schema.enums.ObjectMetadata;
 import org.onap.aai.schema.enums.PropertyMetadata;
-import org.onap.aai.edges.EdgeRule;
-import org.onap.aai.edges.EdgeRuleQuery;
-import org.onap.aai.edges.enums.EdgeType;
-import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.serialization.db.exceptions.NoEdgeRuleFoundException;
 
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import java.util.*;
-
 /**
  * The Class GraphTraversalBuilder.
  */
 public abstract class GraphTraversalBuilder extends QueryBuilder {
 
-	protected GraphTraversal traversal = null;
-	protected Admin completeTraversal = null;
+    protected GraphTraversal traversal = null;
+    protected Admin completeTraversal = null;
 
-	/**
-	 * Instantiates a new graph traversal builder.
-	 *
-	 * @param loader the loader
-	 */
-	public GraphTraversalBuilder(Loader loader, GraphTraversalSource source) {
-		super(loader, source);
+    /**
+     * Instantiates a new graph traversal builder.
+     *
+     * @param loader the loader
+     */
+    public GraphTraversalBuilder(Loader loader, GraphTraversalSource source) {
+        super(loader, source);
 
-		traversal = (GraphTraversal) __.start();
+        traversal = (GraphTraversal) __.start();
 
-	}
+    }
 
-	/**
-	 * Instantiates a new graph traversal builder.
-	 *
-	 * @param loader the loader
-	 * @param start the start
-	 */
-	public GraphTraversalBuilder(Loader loader, GraphTraversalSource source, Vertex start) {
-		super(loader, source, start);
+    /**
+     * Instantiates a new graph traversal builder.
+     *
+     * @param loader the loader
+     * @param start the start
+     */
+    public GraphTraversalBuilder(Loader loader, GraphTraversalSource source, Vertex start) {
+        super(loader, source, start);
 
-		traversal = (GraphTraversal) __.__(start);
+        traversal = (GraphTraversal) __.__(start);
 
-	}
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getVerticesByProperty(String key, Object value) {
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getVerticesByProperty(String key, Object value) {
 
-		// correct value call because the index is registered as an Integer
-		traversal.has(key, this.correctObjectType(value));
+        // correct value call because the index is registered as an Integer
+        traversal.has(key, this.correctObjectType(value));
 
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getVerticesByProperty(final String key, final List values) {
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getVerticesByProperty(final String key, final List values) {
 
-		//this is because the index is registered as an Integer
-		List correctedValues = new ArrayList<>();
-		for (Object item : values) {
-			correctedValues.add(this.correctObjectType(item));
-		}
+        // this is because the index is registered as an Integer
+        List correctedValues = new ArrayList<>();
+        for (Object item : values) {
+            correctedValues.add(this.correctObjectType(item));
+        }
 
-		traversal.has(key, P.within(correctedValues));
+        traversal.has(key, P.within(correctedValues));
 
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getVerticesStartsWithProperty(String key, Object value) {
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getVerticesStartsWithProperty(String key, Object value) {
 
-		// correct value call because the index is registered as an Integer
-		traversal.has(key, org.janusgraph.core.attribute.Text.textPrefix(value));
+        // correct value call because the index is registered as an Integer
+        traversal.has(key, org.janusgraph.core.attribute.Text.textPrefix(value));
 
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
 
     /**
      * @{inheritDoc}
@@ -147,37 +148,36 @@ public abstract class GraphTraversalBuilder extends QueryBuilder {
         return (QueryBuilder) this;
     }
 
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getVerticesExcludeByProperty(String key, Object value) {
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getVerticesExcludeByProperty(String key, Object value) {
-
-		// correct value call because the index is registered as an Integer
-		traversal.has(key, P.neq(this.correctObjectType(value)));
+        // correct value call because the index is registered as an Integer
+        traversal.has(key, P.neq(this.correctObjectType(value)));
 
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getVerticesExcludeByProperty(final String key, final List values) {
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getVerticesExcludeByProperty(final String key, final List values) {
 
-		//this is because the index is registered as an Integer
-		List correctedValues = new ArrayList<>();
-		for (Object item : values) {
-			correctedValues.add(this.correctObjectType(item));
-		}
+        // this is because the index is registered as an Integer
+        List correctedValues = new ArrayList<>();
+        for (Object item : values) {
+            correctedValues.add(this.correctObjectType(item));
+        }
 
-		traversal.has(key, P.without(correctedValues));
+        traversal.has(key, P.without(correctedValues));
 
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
 
     @Override
     public QueryBuilder getVerticesGreaterThanProperty(final String key, Object value) {
@@ -197,703 +197,709 @@ public abstract class GraphTraversalBuilder extends QueryBuilder {
         return (QueryBuilder) this;
     }
 
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getChildVerticesFromParent(String parentKey, String parentValue, String childType) {
+        traversal.has(parentKey, parentValue).has(AAIProperties.NODE_TYPE, childType);
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getTypedVerticesByMap(String type, Map map) {
+
+        for (Map.Entry es : map.entrySet()) {
+            traversal.has(es.getKey(), es.getValue());
+            stepIndex++;
+        }
+        traversal.has(AAIProperties.NODE_TYPE, type);
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder getVerticesByBooleanProperty(String key, Object value) {
+
+        if (value != null && !"".equals(value)) {
+            boolean bValue = false;
+
+            if (value instanceof String) {// "true"
+                bValue = Boolean.valueOf(value.toString());
+            } else if (value instanceof Boolean) {// true
+                bValue = (Boolean) value;
+            }
+
+            traversal.has(key, bValue);
+            stepIndex++;
+        }
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder createKeyQuery(Introspector obj) {
+        Set keys = obj.getKeys();
+        Object val;
+        for (String key : keys) {
+            val = obj.getValue(key);
+            Optional metadata = obj.getPropertyMetadata(key, PropertyMetadata.DB_ALIAS);
+            if (metadata.isPresent()) {
+                // use the db name for the field rather than the object model
+                key = metadata.get();
+            }
+            if (val != null) {
+                // this is because the index is registered as an Integer
+                if (val.getClass().equals(Long.class)) {
+                    traversal.has(key, new Integer(val.toString()));
+                } else {
+                    traversal.has(key, val);
+                }
+                stepIndex++;
+            }
+        }
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder exactMatchQuery(Introspector obj) {
+        this.createKeyQuery(obj);
+        allPropertiesQuery(obj);
+        this.createContainerQuery(obj);
+        return (QueryBuilder) this;
+    }
+
+    private void allPropertiesQuery(Introspector obj) {
+        Set props = obj.getProperties();
+        Set keys = obj.getKeys();
+        Object val;
+        for (String prop : props) {
+            if (obj.isSimpleType(prop) && !keys.contains(prop)) {
+                val = obj.getValue(prop);
+                if (val != null) {
+                    Optional metadata = obj.getPropertyMetadata(prop, PropertyMetadata.DB_ALIAS);
+                    if (metadata.isPresent()) {
+                        // use the db name for the field rather than the object model
+                        prop = metadata.get();
+                    }
+                    // this is because the index is registered as an Integer
+                    if (val.getClass().equals(Long.class)) {
+                        traversal.has(prop, new Integer(val.toString()));
+                    } else {
+                        traversal.has(prop, val);
+                    }
+                    stepIndex++;
+                }
+            }
+        }
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+
+    public QueryBuilder createContainerQuery(Introspector obj) {
+        String type = obj.getChildDBName();
+        String abstractType = obj.getMetadata(ObjectMetadata.ABSTRACT);
+        if (abstractType != null) {
+            String[] inheritors = obj.getMetadata(ObjectMetadata.INHERITORS).split(",");
+            traversal.has(AAIProperties.NODE_TYPE, P.within(inheritors));
+        } else {
+            traversal.has(AAIProperties.NODE_TYPE, type);
+        }
+        stepIndex++;
+        markContainer();
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * @throws NoEdgeRuleFoundException
+     * @throws AAIException
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder createEdgeTraversal(EdgeType type, Introspector parent, Introspector child)
+            throws AAIException {
+        createTraversal(type, parent, child, false);
+        return (QueryBuilder) this;
+
+    }
+
+    @Override
+    public QueryBuilder createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child)
+            throws AAIException {
+        this.createTraversal(type, parent, child, true);
+        return (QueryBuilder) this;
+    }
+
+    private void createTraversal(EdgeType type, Introspector parent, Introspector child, boolean isPrivateEdge)
+            throws AAIException {
+        String isAbstractType = parent.getMetadata(ObjectMetadata.ABSTRACT);
+        if ("true".equals(isAbstractType)) {
+            markParentBoundary();
+            traversal.union(handleAbstractEdge(type, parent, child, isPrivateEdge));
+            stepIndex++;
+        } else {
+            this.edgeQueryToVertex(type, parent, child, null);
+        }
+    }
+
+    /**
+     *
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in,
+            List labels) throws AAIException {
+        this.edgeQueryToVertex(type, out, in, labels);
+        return (QueryBuilder) this;
+    }
+
+    private Traversal[] handleAbstractEdge(EdgeType type, Introspector abstractParent,
+            Introspector child, boolean isPrivateEdge) throws AAIException {
+        String childName = child.getDbName();
+        String inheritorMetadata = abstractParent.getMetadata(ObjectMetadata.INHERITORS);
+        String[] inheritors = inheritorMetadata.split(",");
+        List> unionTraversals = new ArrayList<>(inheritors.length);
+
+        for (int i = 0; i < inheritors.length; i++) {
+            String inheritor = inheritors[i];
+            EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(inheritor, childName);
+            if (edgeRules.hasRule(qB.build())) {
+                Multimap rules = ArrayListMultimap.create();
+                try {
+                    rules = edgeRules.getRules(qB.edgeType(type).build());
+                } catch (EdgeRuleNotFoundException e) {
+                    throw new NoEdgeRuleFoundException(e);
+                }
+
+                GraphTraversal innerTraversal = __.start();
+
+                final List inLabels = new ArrayList<>();
+                final List outLabels = new ArrayList<>();
+
+                rules.values().forEach(rule -> {
+                    if (rule.getDirection().equals(Direction.IN)) {
+                        inLabels.add(rule.getLabel());
+                    } else {
+                        outLabels.add(rule.getLabel());
+                    }
+                });
+
+                if (inLabels.isEmpty() && !outLabels.isEmpty()) {
+                    innerTraversal.out(outLabels.toArray(new String[outLabels.size()]));
+                } else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
+                    innerTraversal.in(inLabels.toArray(new String[inLabels.size()]));
+                } else {
+                    innerTraversal.union(__.out(outLabels.toArray(new String[outLabels.size()])),
+                            __.in(inLabels.toArray(new String[inLabels.size()])));
+                }
+
+                innerTraversal.has(AAIProperties.NODE_TYPE, childName);
+                unionTraversals.add(innerTraversal);
+            }
+        }
+
+        return unionTraversals.toArray(new Traversal[unionTraversals.size()]);
+    }
+
+    public QueryBuilder getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType,
+            List labels) throws AAIException {
+        Introspector outObj = loader.introspectorFromName(outNodeType);
+        Introspector inObj = loader.introspectorFromName(inNodeType);
+        this.edgeQuery(type, outObj, inObj, labels);
+
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder union(QueryBuilder... builder) {
+        GraphTraversal[] traversals = new GraphTraversal[builder.length];
+        for (int i = 0; i < builder.length; i++) {
+            traversals[i] = (GraphTraversal) builder[i].getQuery();
+        }
+        this.traversal.union(traversals);
+        stepIndex++;
+
+        return this;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder where(QueryBuilder... builder) {
+        for (int i = 0; i < builder.length; i++) {
+            this.traversal.where((GraphTraversal) builder[i].getQuery());
+            stepIndex++;
+        }
 
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getChildVerticesFromParent(String parentKey, String parentValue, String childType) {
-		traversal.has(parentKey, parentValue).has(AAIProperties.NODE_TYPE, childType);
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getTypedVerticesByMap(String type, Map map) {
-
-		for (Map.Entry es : map.entrySet()) {
-			traversal.has(es.getKey(), es.getValue());
-			stepIndex++;
-		}
-		traversal.has(AAIProperties.NODE_TYPE, type);
-		stepIndex++;
-		return (QueryBuilder) this;
-	}
-
-	@Override
-	public QueryBuilder getVerticesByBooleanProperty(String key, Object value) {
-
-		if(value!=null && !"".equals(value)) {
-			boolean bValue = false;
-	
-		    if(value instanceof String){//"true"
-		    	bValue = Boolean.valueOf(value.toString());
-			} else if(value instanceof Boolean){//true
-		    	bValue = (Boolean) value;
-			}
-	
-			traversal.has(key, bValue);
-			stepIndex++;
-		}
-		return (QueryBuilder) this;
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder createKeyQuery(Introspector obj) {
-		Set keys = obj.getKeys();
-		Object val;
-		for (String key : keys) {
-			val = obj.getValue(key);
-			Optional metadata = obj.getPropertyMetadata(key, PropertyMetadata.DB_ALIAS);
-			if (metadata.isPresent()) {
-				//use the db name for the field rather than the object model
-				key = metadata.get();
-			}
-			if (val != null) {
-				//this is because the index is registered as an Integer
-				if (val.getClass().equals(Long.class)) {
-					traversal.has(key,new Integer(val.toString()));
-				} else {
-					traversal.has(key, val);
-				}
-				stepIndex++;
-			}
-		}
-		return (QueryBuilder) this;
-	}
-
-	@Override
-	public QueryBuilder exactMatchQuery(Introspector obj) {
-		this.createKeyQuery(obj);
-		allPropertiesQuery(obj);
-		this.createContainerQuery(obj);
-		return (QueryBuilder) this;
-	}
-
-	private void allPropertiesQuery(Introspector obj) {
-		Set props = obj.getProperties();
-		Set keys = obj.getKeys();
-		Object val;
-		for (String prop : props) {
-			if (obj.isSimpleType(prop) && !keys.contains(prop)) {
-				val = obj.getValue(prop);
-				if (val != null) {
-					Optional metadata = obj.getPropertyMetadata(prop, PropertyMetadata.DB_ALIAS);
-					if (metadata.isPresent()) {
-						//use the db name for the field rather than the object model
-						prop = metadata.get();
-					}
-					//this is because the index is registered as an Integer
-					if (val.getClass().equals(Long.class)) {
-						traversal.has(prop,new Integer(val.toString()));
-					} else {
-						traversal.has(prop, val);
-					}
-					stepIndex++;
-				}
-			}
-		}
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-
-	public QueryBuilder createContainerQuery(Introspector obj) {
-		String type = obj.getChildDBName();
-		String abstractType = obj.getMetadata(ObjectMetadata.ABSTRACT);
-		if (abstractType != null) {
-			String[] inheritors = obj.getMetadata(ObjectMetadata.INHERITORS).split(",");
-			traversal.has(AAIProperties.NODE_TYPE, P.within(inheritors));
-		} else {
-			traversal.has(AAIProperties.NODE_TYPE, type);
-		}
-		stepIndex++;
-		markContainer();
-		return (QueryBuilder) this;
-	}
-
-	/**
-	 * @throws NoEdgeRuleFoundException
-	 * @throws AAIException
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException {
-		createTraversal(type, parent, child, false);
-		return (QueryBuilder) this;
-
-	}
-
-	@Override
-	public QueryBuilder createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException {
-	    this.createTraversal(type, parent, child, true);
-		return (QueryBuilder) this;
-	}
-
-	private void createTraversal(EdgeType type, Introspector parent, Introspector child, boolean isPrivateEdge) throws AAIException {
-		String isAbstractType = parent.getMetadata(ObjectMetadata.ABSTRACT);
-		if ("true".equals(isAbstractType)) {
-			markParentBoundary();
-			traversal.union(handleAbstractEdge(type, parent, child, isPrivateEdge));
-			stepIndex++;
-		} else {
-			this.edgeQueryToVertex(type, parent, child, null);
-		}
-	}
-
-	/**
-	 *
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, List labels) throws AAIException {
-		this.edgeQueryToVertex(type, out, in, labels);
-		return (QueryBuilder) this;
-	}
-
-	private Traversal[] handleAbstractEdge(EdgeType type, Introspector abstractParent, Introspector child, boolean isPrivateEdge) throws AAIException {
-		String childName = child.getDbName();
-		String inheritorMetadata = abstractParent.getMetadata(ObjectMetadata.INHERITORS);
-		String[] inheritors = inheritorMetadata.split(",");
-		List> unionTraversals = new ArrayList<>(inheritors.length);
-
-		for (int i = 0; i < inheritors.length; i++) {
-			String inheritor = inheritors[i];
-			EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(inheritor, childName);
-			if (edgeRules.hasRule(qB.build())) {
-				Multimap rules = ArrayListMultimap.create();
-				try {
-					rules = edgeRules.getRules(qB.edgeType(type).build());
-				} catch (EdgeRuleNotFoundException e) {
-					throw new NoEdgeRuleFoundException(e);
-				}
-
-				GraphTraversal innerTraversal = __.start();
-
-				final List inLabels = new ArrayList<>();
-				final List outLabels = new ArrayList<>();
-
-				rules.values().forEach(rule -> {
-					if (rule.getDirection().equals(Direction.IN)) {
-						inLabels.add(rule.getLabel());
-					} else {
-						outLabels.add(rule.getLabel());
-					}
-				} );
-
-				if (inLabels.isEmpty() && !outLabels.isEmpty()) {
-					innerTraversal.out(outLabels.toArray(new String[outLabels.size()]));
-				} else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
-					innerTraversal.in(inLabels.toArray(new String[inLabels.size()]));
-				} else {
-					innerTraversal.union(__.out(outLabels.toArray(new String[outLabels.size()])), __.in(inLabels.toArray(new String[inLabels.size()])));
-				}
-
-				innerTraversal.has(AAIProperties.NODE_TYPE, childName);
-				unionTraversals.add(innerTraversal);
-			}
-		}
-
-		return unionTraversals.toArray(new Traversal[unionTraversals.size()]);
-	}
-
-	public QueryBuilder getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, List labels) throws AAIException {
-		Introspector outObj = loader.introspectorFromName(outNodeType);
-		Introspector inObj = loader.introspectorFromName(inNodeType);
-		this.edgeQuery(type, outObj, inObj, labels);
-
-		return (QueryBuilder)this;
-	}
-
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder union(QueryBuilder... builder) {
-		GraphTraversal[] traversals = new GraphTraversal[builder.length];
-		for (int i = 0; i < builder.length; i++) {
-			traversals[i] = (GraphTraversal)builder[i].getQuery();
-		}
-		this.traversal.union(traversals);
-		stepIndex++;
-
-		return this;
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder where(QueryBuilder... builder) {
-		for (int i = 0; i < builder.length; i++) {
-			this.traversal.where((GraphTraversal)builder[i].getQuery());
-			stepIndex++;
-		}
-
-		return this;
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder or(QueryBuilder... builder) {
-		GraphTraversal[] traversals = new GraphTraversal[builder.length];
-		for (int i = 0; i < builder.length; i++) {
-			traversals[i] = (GraphTraversal)builder[i].getQuery();
-		}
-		this.traversal.or(traversals);
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder store(String name) {
-
-		this.traversal.store(name);
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder cap(String name) {
-		this.traversal.cap(name);
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder unfold() {
-		this.traversal.unfold();
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder dedup() {
-
-		this.traversal.dedup();
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder emit() {
-
-		this.traversal.emit();
-		stepIndex++;
-
-		return this;
-
-	}
-
-	@Override
-	public QueryBuilder repeat(QueryBuilder builder) {
-
-		this.traversal.repeat((GraphTraversal)builder.getQuery());
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder until(QueryBuilder builder) {
-		this.traversal.until((GraphTraversal)builder.getQuery());
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder groupCount() {
-		this.traversal.groupCount();
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder both() {
-		this.traversal.both();
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder tree() {
-
-		this.traversal.tree();
-		stepIndex++;
-
-		return (QueryBuilder)this;
-	}
-
-	@Override
-	public QueryBuilder by(String name) {
-		this.traversal.by(name);
-		stepIndex++;
-
-		return this;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public QueryBuilder simplePath(){
-		this.traversal.simplePath();
-		stepIndex++;
-		return this;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public QueryBuilder path(){
-		this.traversal.path();
-		stepIndex++;
-		return (QueryBuilder)this;
-	}
-
-	@Override
-	public QueryBuilder outE() {
-		this.traversal.outE();
-		stepIndex++;
-		return (QueryBuilder)this;
-	}
-
-	@Override
-	public QueryBuilder inE() {
-		this.traversal.inE();
-		stepIndex++;
-		return (QueryBuilder)this;
-	}
-
-	@Override
-	public QueryBuilder outV() {
-		this.traversal.outV();
-		stepIndex++;
-		return (QueryBuilder)this;
-	}
-
-	@Override
-	public QueryBuilder inV() {
-		this.traversal.inV();
-		stepIndex++;
-		return (QueryBuilder)this;
-	}
-
-	@Override
-	public QueryBuilder as(String name) {
-		this.traversal.as(name);
-
-		stepIndex++;
-		return this;
-	}
-
-	@Override
-	public QueryBuilder not(QueryBuilder builder) {
-		this.traversal.not(builder.getQuery());
-
-		stepIndex++;
-		return this;
-	}
-
-	@Override
-	public QueryBuilder select(String name) {
-		this.traversal.select(name);
-
-		stepIndex++;
-
-		return this;
-	}
-
-	@Override
-	public QueryBuilder select(String... names) {
-		if(names.length == 1) {
-			this.traversal.select(names[0]);
-		}
-		else if(names.length == 2) {
-			this.traversal.select(names[0], names[1]);
-		}
-		else if(names.length > 2){
-			String[] otherNames = Arrays.copyOfRange(names, 2, names.length);
-			this.traversal.select(names[0], names[1], otherNames);
-		}
-
-		stepIndex++;
-
-		return this;
-	}
-
-	/**
-	 * Edge query.
-	 *
-	 * @param outObj the out type
-	 * @param inObj the in type
-	 * @throws NoEdgeRuleFoundException
-	 * @throws AAIException
-	 */
-	private void edgeQueryToVertex(EdgeType type, Introspector outObj, Introspector inObj, List labels) throws AAIException {
-		String outType = outObj.getDbName();
-		String inType = inObj.getDbName();
-
-		if (outObj.isContainer()) {
-			outType = outObj.getChildDBName();
-		}
-		if (inObj.isContainer()) {
-			inType = inObj.getChildDBName();
-		}
-		markParentBoundary();
-		Multimap rules = ArrayListMultimap.create();
-		EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(outType, inType).edgeType(type);
-
-		if (labels == null) {
-			try {
-				rules.putAll(edgeRules.getRules(qB.build()));
-			} catch (EdgeRuleNotFoundException e) {
-				//is ok per original functioning of this section
-				//TODO add "best try" sort of flag to the EdgeRuleQuery
-				// to indicate if the exception should be thrown or not
-			}
-		} else {
-			for (String label : labels) {
-				try {
-					rules.putAll(edgeRules.getRules(qB.label(label).build()));
-				} catch (EdgeRuleNotFoundException e) {
-					throw new NoEdgeRuleFoundException(e);
-				}
-			}
-			if (rules.isEmpty()) {
-				throw new NoEdgeRuleFoundException("No edge rules found for " + outType + " and " + inType + " of type " + type.toString());
-			}
-		}
-
-
-		final List inLabels = new ArrayList<>();
-		final List outLabels = new ArrayList<>();
-
-		for (EdgeRule rule : rules.values()) {
-			if (labels != null && !labels.contains(rule.getLabel())) {
-				return;
-			} else {
-				if (Direction.IN.equals(rule.getDirection())) {
-					inLabels.add(rule.getLabel());
-				} else {
-					outLabels.add(rule.getLabel());
-				}
-			}
-		}
-
-		if (inLabels.isEmpty() && !outLabels.isEmpty()) {
-			traversal.out(outLabels.toArray(new String[outLabels.size()]));
-		} else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
-			traversal.in(inLabels.toArray(new String[inLabels.size()]));
-		} else {
-			traversal.union(__.out(outLabels.toArray(new String[outLabels.size()])), __.in(inLabels.toArray(new String[inLabels.size()])));
-		}
-
-		stepIndex++;
-
-		this.createContainerQuery(inObj);
-
-	}
-
-	/**
-	 * Edge query.
-	 *
-	 * @param outObj the out type
-	 * @param inObj the in type
-	 * @throws NoEdgeRuleFoundException
-	 * @throws AAIException
-	 */
-	private void edgeQuery(EdgeType type, Introspector outObj, Introspector inObj, List labels) throws AAIException {
-		String outType = outObj.getDbName();
-		String inType = inObj.getDbName();
-
-		if (outObj.isContainer()) {
-			outType = outObj.getChildDBName();
-		}
-		if (inObj.isContainer()) {
-			inType = inObj.getChildDBName();
-		}
-
-		markParentBoundary();
-		Multimap rules = ArrayListMultimap.create();
-		EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(outType, inType).edgeType(type);
-
-		try {
-			if (labels == null) {
-				rules.putAll(edgeRules.getRules(qB.build()));
-			} else {
-				for (String label : labels) {
-					rules.putAll(edgeRules.getRules(qB.label(label).build()));
-				}
-			}
-		} catch (EdgeRuleNotFoundException e) {
-			throw new NoEdgeRuleFoundException(e);
-		}
-
-		final List inLabels = new ArrayList<>();
-		final List outLabels = new ArrayList<>();
-
-		for (EdgeRule rule : rules.values()) {
-			if (labels != null && !labels.contains(rule.getLabel())) {
-				return;
-			} else {
-				if (Direction.IN.equals(rule.getDirection())) {
-					inLabels.add(rule.getLabel());
-				} else {
-					outLabels.add(rule.getLabel());
-				}
-			}
-		}
-
-		if (inLabels.isEmpty() && !outLabels.isEmpty()) {
-			traversal.outE(outLabels.toArray(new String[outLabels.size()]));
-		} else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
-			traversal.inE(inLabels.toArray(new String[inLabels.size()]));
-		} else {
-			traversal.union(__.outE(outLabels.toArray(new String[outLabels.size()])), __.inE(inLabels.toArray(new String[inLabels.size()])));
-		}
-	}
-
-	@Override
-	public QueryBuilder limit(long amount) {
-		traversal.limit(amount);
-		return this;
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public  E2 getQuery() {
-		return (E2)this.traversal;
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder getParentQuery() {
-
-		return cloneQueryAtStep(parentStepIndex);
-	}
-
-	@Override
-	public QueryBuilder getContainerQuery() {
-
-		if (this.parentStepIndex == 0) {
-			return removeQueryStepsBetween(0, containerStepIndex);
-		} else {
-			return cloneQueryAtStep(containerStepIndex);
-		}
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public void markParentBoundary() {
-		parentStepIndex = stepIndex;
-	}
-
-	@Override
-	public void markContainer() {
-		containerStepIndex = stepIndex;
-	}
-
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public Vertex getStart() {
-		return this.start;
-	}
-
-	protected int getParentStepIndex() {
-		return parentStepIndex;
-	}
-
-	protected int getContainerStepIndex() {
-		return containerStepIndex;
-	}
-
-	protected int getStepIndex() {
-		return stepIndex;
-	}
-
-	/**
-	 * end is exclusive
-	 *
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	protected abstract QueryBuilder removeQueryStepsBetween(int start, int end);
-
-	protected void executeQuery() {
-
-		Admin admin;
-		if (start != null) {
-			this.completeTraversal = traversal.asAdmin();
-		} else {
-			admin = source.V().asAdmin();
-			TraversalHelper.insertTraversal(admin.getEndStep(), traversal.asAdmin(), admin);
-
-			this.completeTraversal = (Admin) admin;
-
-		}
-
-	}
-
-	@Override
-	public boolean hasNext() {
-		if (this.completeTraversal == null) {
-			executeQuery();
-		}
-
-		return this.completeTraversal.hasNext();
-	}
-
-	@Override
-	public E next() {
-		if (this.completeTraversal == null) {
-			executeQuery();
-		}
-
-		return this.completeTraversal.next();
-	}
-
-	@Override
-	public List toList() {
-		if (this.completeTraversal == null) {
-			executeQuery();
-		}
-		return this.completeTraversal.toList();
-	}
-
-	protected QueryBuilder has(String key, String value) {
-		traversal.has(key, value);
-
-		return (QueryBuilder)this;
-	}
+        return this;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder or(QueryBuilder... builder) {
+        GraphTraversal[] traversals = new GraphTraversal[builder.length];
+        for (int i = 0; i < builder.length; i++) {
+            traversals[i] = (GraphTraversal) builder[i].getQuery();
+        }
+        this.traversal.or(traversals);
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder store(String name) {
+
+        this.traversal.store(name);
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder cap(String name) {
+        this.traversal.cap(name);
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder unfold() {
+        this.traversal.unfold();
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder dedup() {
+
+        this.traversal.dedup();
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder emit() {
+
+        this.traversal.emit();
+        stepIndex++;
+
+        return this;
+
+    }
+
+    @Override
+    public QueryBuilder repeat(QueryBuilder builder) {
+
+        this.traversal.repeat((GraphTraversal) builder.getQuery());
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder until(QueryBuilder builder) {
+        this.traversal.until((GraphTraversal) builder.getQuery());
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder groupCount() {
+        this.traversal.groupCount();
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder both() {
+        this.traversal.both();
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder tree() {
+
+        this.traversal.tree();
+        stepIndex++;
+
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder by(String name) {
+        this.traversal.by(name);
+        stepIndex++;
+
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public QueryBuilder simplePath() {
+        this.traversal.simplePath();
+        stepIndex++;
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public QueryBuilder path() {
+        this.traversal.path();
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder outE() {
+        this.traversal.outE();
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder inE() {
+        this.traversal.inE();
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder outV() {
+        this.traversal.outV();
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder inV() {
+        this.traversal.inV();
+        stepIndex++;
+        return (QueryBuilder) this;
+    }
+
+    @Override
+    public QueryBuilder as(String name) {
+        this.traversal.as(name);
+
+        stepIndex++;
+        return this;
+    }
+
+    @Override
+    public QueryBuilder not(QueryBuilder builder) {
+        this.traversal.not(builder.getQuery());
+
+        stepIndex++;
+        return this;
+    }
+
+    @Override
+    public QueryBuilder select(String name) {
+        this.traversal.select(name);
+
+        stepIndex++;
+
+        return this;
+    }
+
+    @Override
+    public QueryBuilder select(String... names) {
+        if (names.length == 1) {
+            this.traversal.select(names[0]);
+        } else if (names.length == 2) {
+            this.traversal.select(names[0], names[1]);
+        } else if (names.length > 2) {
+            String[] otherNames = Arrays.copyOfRange(names, 2, names.length);
+            this.traversal.select(names[0], names[1], otherNames);
+        }
+
+        stepIndex++;
+
+        return this;
+    }
+
+    /**
+     * Edge query.
+     *
+     * @param outObj the out type
+     * @param inObj the in type
+     * @throws NoEdgeRuleFoundException
+     * @throws AAIException
+     */
+    private void edgeQueryToVertex(EdgeType type, Introspector outObj, Introspector inObj, List labels)
+            throws AAIException {
+        String outType = outObj.getDbName();
+        String inType = inObj.getDbName();
+
+        if (outObj.isContainer()) {
+            outType = outObj.getChildDBName();
+        }
+        if (inObj.isContainer()) {
+            inType = inObj.getChildDBName();
+        }
+        markParentBoundary();
+        Multimap rules = ArrayListMultimap.create();
+        EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(outType, inType).edgeType(type);
+
+        if (labels == null) {
+            try {
+                rules.putAll(edgeRules.getRules(qB.build()));
+            } catch (EdgeRuleNotFoundException e) {
+                // is ok per original functioning of this section
+                // TODO add "best try" sort of flag to the EdgeRuleQuery
+                // to indicate if the exception should be thrown or not
+            }
+        } else {
+            for (String label : labels) {
+                try {
+                    rules.putAll(edgeRules.getRules(qB.label(label).build()));
+                } catch (EdgeRuleNotFoundException e) {
+                    throw new NoEdgeRuleFoundException(e);
+                }
+            }
+            if (rules.isEmpty()) {
+                throw new NoEdgeRuleFoundException(
+                        "No edge rules found for " + outType + " and " + inType + " of type " + type.toString());
+            }
+        }
+
+        final List inLabels = new ArrayList<>();
+        final List outLabels = new ArrayList<>();
+
+        for (EdgeRule rule : rules.values()) {
+            if (labels != null && !labels.contains(rule.getLabel())) {
+                return;
+            } else {
+                if (Direction.IN.equals(rule.getDirection())) {
+                    inLabels.add(rule.getLabel());
+                } else {
+                    outLabels.add(rule.getLabel());
+                }
+            }
+        }
+
+        if (inLabels.isEmpty() && !outLabels.isEmpty()) {
+            traversal.out(outLabels.toArray(new String[outLabels.size()]));
+        } else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
+            traversal.in(inLabels.toArray(new String[inLabels.size()]));
+        } else {
+            traversal.union(__.out(outLabels.toArray(new String[outLabels.size()])),
+                    __.in(inLabels.toArray(new String[inLabels.size()])));
+        }
+
+        stepIndex++;
+
+        this.createContainerQuery(inObj);
+
+    }
+
+    /**
+     * Edge query.
+     *
+     * @param outObj the out type
+     * @param inObj the in type
+     * @throws NoEdgeRuleFoundException
+     * @throws AAIException
+     */
+    private void edgeQuery(EdgeType type, Introspector outObj, Introspector inObj, List labels)
+            throws AAIException {
+        String outType = outObj.getDbName();
+        String inType = inObj.getDbName();
+
+        if (outObj.isContainer()) {
+            outType = outObj.getChildDBName();
+        }
+        if (inObj.isContainer()) {
+            inType = inObj.getChildDBName();
+        }
+
+        markParentBoundary();
+        Multimap rules = ArrayListMultimap.create();
+        EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(outType, inType).edgeType(type);
+
+        try {
+            if (labels == null) {
+                rules.putAll(edgeRules.getRules(qB.build()));
+            } else {
+                for (String label : labels) {
+                    rules.putAll(edgeRules.getRules(qB.label(label).build()));
+                }
+            }
+        } catch (EdgeRuleNotFoundException e) {
+            throw new NoEdgeRuleFoundException(e);
+        }
+
+        final List inLabels = new ArrayList<>();
+        final List outLabels = new ArrayList<>();
+
+        for (EdgeRule rule : rules.values()) {
+            if (labels != null && !labels.contains(rule.getLabel())) {
+                return;
+            } else {
+                if (Direction.IN.equals(rule.getDirection())) {
+                    inLabels.add(rule.getLabel());
+                } else {
+                    outLabels.add(rule.getLabel());
+                }
+            }
+        }
+
+        if (inLabels.isEmpty() && !outLabels.isEmpty()) {
+            traversal.outE(outLabels.toArray(new String[outLabels.size()]));
+        } else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
+            traversal.inE(inLabels.toArray(new String[inLabels.size()]));
+        } else {
+            traversal.union(__.outE(outLabels.toArray(new String[outLabels.size()])),
+                    __.inE(inLabels.toArray(new String[inLabels.size()])));
+        }
+    }
+
+    @Override
+    public QueryBuilder limit(long amount) {
+        traversal.limit(amount);
+        return this;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public  E2 getQuery() {
+        return (E2) this.traversal;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder getParentQuery() {
+
+        return cloneQueryAtStep(parentStepIndex);
+    }
+
+    @Override
+    public QueryBuilder getContainerQuery() {
+
+        if (this.parentStepIndex == 0) {
+            return removeQueryStepsBetween(0, containerStepIndex);
+        } else {
+            return cloneQueryAtStep(containerStepIndex);
+        }
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public void markParentBoundary() {
+        parentStepIndex = stepIndex;
+    }
+
+    @Override
+    public void markContainer() {
+        containerStepIndex = stepIndex;
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public Vertex getStart() {
+        return this.start;
+    }
+
+    protected int getParentStepIndex() {
+        return parentStepIndex;
+    }
+
+    protected int getContainerStepIndex() {
+        return containerStepIndex;
+    }
+
+    protected int getStepIndex() {
+        return stepIndex;
+    }
+
+    /**
+     * end is exclusive
+     *
+     * @param start
+     * @param end
+     * @return
+     */
+    protected abstract QueryBuilder removeQueryStepsBetween(int start, int end);
+
+    protected void executeQuery() {
+
+        Admin admin;
+        if (start != null) {
+            this.completeTraversal = traversal.asAdmin();
+        } else {
+            admin = source.V().asAdmin();
+            TraversalHelper.insertTraversal(admin.getEndStep(), traversal.asAdmin(), admin);
+
+            this.completeTraversal = (Admin) admin;
+
+        }
+
+    }
+
+    @Override
+    public boolean hasNext() {
+        if (this.completeTraversal == null) {
+            executeQuery();
+        }
+
+        return this.completeTraversal.hasNext();
+    }
+
+    @Override
+    public E next() {
+        if (this.completeTraversal == null) {
+            executeQuery();
+        }
+
+        return this.completeTraversal.next();
+    }
+
+    @Override
+    public List toList() {
+        if (this.completeTraversal == null) {
+            executeQuery();
+        }
+        return this.completeTraversal.toList();
+    }
+
+    protected QueryBuilder has(String key, String value) {
+        traversal.has(key, value);
+
+        return (QueryBuilder) this;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java
index 1dc2cfe8..98da0766 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java
@@ -19,12 +19,15 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
 
+import java.util.*;
+
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
@@ -33,19 +36,17 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.edges.EdgeRule;
+import org.onap.aai.edges.EdgeRuleQuery;
+import org.onap.aai.edges.enums.EdgeType;
+import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.restcore.search.GremlinGroovyShell;
 import org.onap.aai.schema.enums.ObjectMetadata;
-import org.onap.aai.edges.EdgeRule;
-import org.onap.aai.edges.EdgeRuleQuery;
-import org.onap.aai.edges.enums.EdgeType;
-import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.serialization.db.exceptions.NoEdgeRuleFoundException;
 
-import java.util.*;
-
 /**
  * The Class GremlinQueryBuilder.
  */
@@ -93,7 +94,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
     public QueryBuilder getVerticesByProperty(String key, Object value) {
 
         String term = "";
-        if (value != null && !(value instanceof String) ) {
+        if (value != null && !(value instanceof String)) {
             term = value.toString();
         } else {
             term = "'" + value + "'";
@@ -115,18 +116,18 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
     @Override
     public QueryBuilder getVerticesByBooleanProperty(String key, Object value) {
-    	
-    	if(value!=null && !"".equals(value)) {
-    		boolean bValue = false;
-	        if(value instanceof String){
-	            bValue = Boolean.valueOf(value.toString());
-	        } else if(value instanceof Boolean){
-	            bValue = (Boolean) value;
-	        }
-	
-	        list.add(HAS + key + "', " + bValue + ")");
-	        stepIndex++;
-    	}
+
+        if (value != null && !"".equals(value)) {
+            boolean bValue = false;
+            if (value instanceof String) {
+                bValue = Boolean.valueOf(value.toString());
+            } else if (value instanceof Boolean) {
+                bValue = (Boolean) value;
+            }
+
+            list.add(HAS + key + "', " + bValue + ")");
+            stepIndex++;
+        }
         return (QueryBuilder) this;
     }
 
@@ -182,7 +183,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
         String term = "";
         String predicate = "org.janusgraph.core.attribute.Text.textPrefix(#!#argument#!#)";
-        if (value != null && !(value instanceof String) ) {
+        if (value != null && !(value instanceof String)) {
             term = value.toString();
         } else {
             term = "'" + value + "'";
@@ -201,7 +202,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
         String term = "";
         String predicate = "P.neq(#!#argument#!#)";
-        if (value != null && !(value instanceof String) ) {
+        if (value != null && !(value instanceof String)) {
             term = value.toString();
         } else {
             term = "'" + value + "'";
@@ -238,7 +239,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
     public QueryBuilder getVerticesGreaterThanProperty(String key, Object value) {
         String predicate = "P.gte(#!#argument1#!#)";
         String term;
-        if (value != null && !(value instanceof String) ) {
+        if (value != null && !(value instanceof String)) {
             term = value.toString();
         } else {
             term = "'" + value + "'";
@@ -253,7 +254,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
     public QueryBuilder getVerticesLessThanProperty(String key, Object value) {
         String predicate = "P.lte(#!#argument1#!#)";
         String term;
-        if (value != null && !(value instanceof String) ) {
+        if (value != null && !(value instanceof String)) {
             term = value.toString();
         } else {
             term = "'" + value + "'";
@@ -264,15 +265,12 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         return (QueryBuilder) this;
     }
 
-
-
-
     /**
      * @{inheritDoc}
      */
     @Override
     public QueryBuilder getChildVerticesFromParent(String parentKey, String parentValue, String childType) {
-        //TODO
+        // TODO
         return (QueryBuilder) this;
     }
 
@@ -312,7 +310,8 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
      * @{inheritDoc}
      */
     @Override
-    public QueryBuilder createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException {
+    public QueryBuilder createEdgeTraversal(EdgeType type, Introspector parent, Introspector child)
+            throws AAIException {
         String parentName = parent.getDbName();
         String childName = child.getDbName();
         if (parent.isContainer()) {
@@ -327,7 +326,8 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
     }
 
     @Override
-    public QueryBuilder createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException{
+    public QueryBuilder createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child)
+            throws AAIException {
         String parentName = parent.getDbName();
         String childName = child.getDbName();
         if (parent.isContainer()) {
@@ -345,7 +345,8 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
      * @{inheritDoc}
      */
     @Override
-    public QueryBuilder createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, List labels) throws AAIException {
+    public QueryBuilder createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in,
+            List labels) throws AAIException {
         String parentName = out.getDbName();
         String childName = in.getDbName();
         if (out.isContainer()) {
@@ -358,13 +359,14 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         return (QueryBuilder) this;
     }
 
-
-    public QueryBuilder getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, List labels) throws AAIException {
+    public QueryBuilder getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType,
+            List labels) throws AAIException {
         this.edgeQuery(type, outNodeType, inNodeType, labels);
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
-    private void edgeQueryToVertex(EdgeType type, String outType, String inType, List labels) throws AAIException {
+    private void edgeQueryToVertex(EdgeType type, String outType, String inType, List labels)
+            throws AAIException {
         this.edgeQueryToVertex(type, outType, inType, labels, false);
     }
 
@@ -376,7 +378,8 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
      * @throws NoEdgeRuleFoundException
      * @throws AAIException
      */
-    private void edgeQueryToVertex(EdgeType type, String outType, String inType, List labels, boolean isPrivateEdge) throws AAIException {
+    private void edgeQueryToVertex(EdgeType type, String outType, String inType, List labels,
+            boolean isPrivateEdge) throws AAIException {
         markParentBoundary();
         Multimap rules = ArrayListMultimap.create();
         EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(outType, inType).edgeType(type).setPrivate(isPrivateEdge);
@@ -402,26 +405,28 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
             } else {
                 if (Direction.IN.equals(rule.getDirection())) {
                     inLabels.add(rule.getLabel());
-                    if(inType.equals(outType)) {//code to handle when a type edges to itself, to add both in and out
+                    if (inType.equals(outType)) {// code to handle when a type edges to itself, to add both in and out
                         outLabels.add(rule.getLabel());
                     }
                 } else {
                     outLabels.add(rule.getLabel());
-                    if(inType.equals(outType)) {//code to handle when a type edges to itself, to add both in and out
+                    if (inType.equals(outType)) {// code to handle when a type edges to itself, to add both in and out
                         inLabels.add(rule.getLabel());
                     }
                 }
             }
         }
 
-        if(inLabels.isEmpty() && outLabels.isEmpty()) {
-            throw new NoEdgeRuleFoundException("no " + type.toString() + " edge rule between " + outType + " and " + inType );
+        if (inLabels.isEmpty() && outLabels.isEmpty()) {
+            throw new NoEdgeRuleFoundException(
+                    "no " + type.toString() + " edge rule between " + outType + " and " + inType);
         } else if (inLabels.isEmpty() && !outLabels.isEmpty()) {
             list.add(".out('" + String.join("','", outLabels) + "')");
         } else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
             list.add(".in('" + String.join("','", inLabels) + "')");
         } else {
-            list.add(".union(__.in('" + String.join("','", inLabels) + "')" + ", __.out('" + String.join("','", outLabels) + "'))");
+            list.add(".union(__.in('" + String.join("','", inLabels) + "')" + ", __.out('"
+                    + String.join("','", outLabels) + "'))");
         }
         stepIndex++;
         list.add(HAS + AAIProperties.NODE_TYPE + "', '" + inType + "')");
@@ -468,24 +473,28 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
             }
         }
 
-        if(inLabels.isEmpty() && outLabels.isEmpty()) {
-            throw new NoEdgeRuleFoundException("no " + type.toString() + " edge rule between " + outType + " and " + inType );
+        if (inLabels.isEmpty() && outLabels.isEmpty()) {
+            throw new NoEdgeRuleFoundException(
+                    "no " + type.toString() + " edge rule between " + outType + " and " + inType);
         } else if (inLabels.isEmpty() && !outLabels.isEmpty()) {
             list.add(".outE('" + String.join("','", outLabels) + "')");
         } else if (outLabels.isEmpty() && !inLabels.isEmpty()) {
             list.add(".inE('" + String.join("','", inLabels) + "')");
         } else {
-            list.add(".union(__.inE('" + String.join("','", inLabels) + "')" + ", __.outE('" + String.join("','", outLabels) + "'))");
+            list.add(".union(__.inE('" + String.join("','", inLabels) + "')" + ", __.outE('"
+                    + String.join("','", outLabels) + "'))");
         }
 
         stepIndex++;
 
     }
+
     @Override
     public QueryBuilder limit(long amount) {
         list.add(".limit(" + amount + ")");
         return this;
     }
+
     /**
      * @{inheritDoc}
      */
@@ -540,7 +549,6 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         }
         list.addAll(traversals);
 
-
         return this;
     }
 
@@ -563,7 +571,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
     @Override
     public QueryBuilder store(String name) {
-        this.list.add(".store('"+ name + "')");
+        this.list.add(".store('" + name + "')");
         stepIndex++;
 
         return this;
@@ -571,7 +579,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
     @Override
     public QueryBuilder cap(String name) {
-        this.list.add(".cap('"+ name + "')");
+        this.list.add(".cap('" + name + "')");
         stepIndex++;
 
         return this;
@@ -603,7 +611,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
     @Override
     public QueryBuilder repeat(QueryBuilder builder) {
-        this.list.add(".repeat(__" + builder.getQuery()  + ")");
+        this.list.add(".repeat(__" + builder.getQuery() + ")");
         stepIndex++;
 
         return this;
@@ -638,12 +646,12 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         this.list.add(".tree()");
         stepIndex++;
 
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
     @Override
     public QueryBuilder by(String name) {
-        this.list.add(".by('"+ name + "')");
+        this.list.add(".by('" + name + "')");
         stepIndex++;
 
         return this;
@@ -653,7 +661,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
      * {@inheritDoc}
      */
     @Override
-    public QueryBuilder simplePath(){
+    public QueryBuilder simplePath() {
         this.list.add(".simplePath()");
         stepIndex++;
         return this;
@@ -663,10 +671,10 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
      * {@inheritDoc}
      */
     @Override
-    public QueryBuilder path(){
+    public QueryBuilder path() {
         this.list.add(".path()");
         stepIndex++;
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
     @Override
@@ -674,7 +682,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         this.list.add(".outE()");
         stepIndex++;
 
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
     @Override
@@ -682,7 +690,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         this.list.add(".inE()");
         stepIndex++;
 
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
     @Override
@@ -690,7 +698,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         this.list.add(".outV()");
         stepIndex++;
 
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
     @Override
@@ -698,7 +706,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         this.list.add(".inV()");
         stepIndex++;
 
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
     @Override
@@ -727,19 +735,20 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
 
     @Override
     public QueryBuilder select(String... names) {
-    	String stepString = ".select('";
-    	for(int i = 0; i extends QueryBuilder {
             sb.append(piece);
         }
 
-        return (T2)sb.toString();
+        return (T2) sb.toString();
     }
 
     /**
@@ -810,6 +819,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
         }
         this.completeTraversal = this.gremlinGroovy.executeTraversal(queryString, params);
     }
+
     @Override
     public boolean hasNext() {
         if (this.completeTraversal == null) {
@@ -825,7 +835,7 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
             executeQuery();
         }
 
-        return (E)this.completeTraversal.next();
+        return (E) this.completeTraversal.next();
     }
 
     @Override
@@ -834,13 +844,13 @@ public abstract class GremlinQueryBuilder extends QueryBuilder {
             executeQuery();
         }
 
-        return (List)this.completeTraversal.toList();
+        return (List) this.completeTraversal.toList();
     }
 
     protected QueryBuilder has(String key, String value) {
         this.list.add(HAS + key + "','" + value + "')");
 
-        return (QueryBuilder)this;
+        return (QueryBuilder) this;
     }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinTraversal.java b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinTraversal.java
index 22103bda..710db480 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinTraversal.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinTraversal.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
 import java.io.UnsupportedEncodingException;
@@ -39,103 +40,102 @@ import org.onap.aai.parsers.query.TraversalStrategy;
  */
 public class GremlinTraversal extends GremlinQueryBuilder {
 
-	
-	/**
-	 * Instantiates a new gremlin traversal.
-	 *
-	 * @param loader the loader
-	 */
-	public GremlinTraversal(Loader loader, GraphTraversalSource source) {
-		super(loader, source);
-		this.factory = new TraversalStrategy(this.loader, this);
-	}
-	
-	/**
-	 * Instantiates a new gremlin traversal.
-	 *
-	 * @param loader the loader
-	 * @param start the start
-	 */
-	public GremlinTraversal(Loader loader, GraphTraversalSource source, Vertex start) {
-		super(loader, source, start);
-		this.factory = new TraversalStrategy(this.loader, this);
-	}
-	
-
-	protected GremlinTraversal(List traversal, Loader loader, GraphTraversalSource source, GremlinQueryBuilder gtb) {
-		super(loader, source);
-		this.list = traversal;
-		this.stepIndex = gtb.getStepIndex();
-		this.parentStepIndex = gtb.getParentStepIndex();
-		this.containerStepIndex = gtb.getContainerStepIndex();
-		this.factory = new TraversalStrategy(this.loader, this);
-		this.start = gtb.getStart();
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException {
-		return factory.buildURIParser(uri);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromRelationship(Introspector relationship) throws UnsupportedEncodingException, AAIException {
-		return factory.buildRelationshipParser(relationship);
-	}
-
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
-			throws UnsupportedEncodingException, AAIException {
-		return factory.buildURIParser(uri, queryParams);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromObjectName(String objName) {
-		return factory.buildObjectNameParser(objName);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder newInstance(Vertex start) {
-		return new GremlinTraversal<>(loader, source, start);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder newInstance() {
-		return new GremlinTraversal<>(loader, source);
-	}
-	
-	@Override
-	protected QueryBuilder cloneQueryAtStep(int index) {
-		
-		int idx = index;
-		
-		if (idx == 0) {
-			idx = stepIndex;
-		}
-		
-		List newList = new ArrayList<>();
-		for (int i = 0; i < idx; i++) {
-			newList.add(this.list.get(i));
-		}
-		
-		return new GremlinTraversal<>(newList, loader, source, this);
-	}
+    /**
+     * Instantiates a new gremlin traversal.
+     *
+     * @param loader the loader
+     */
+    public GremlinTraversal(Loader loader, GraphTraversalSource source) {
+        super(loader, source);
+        this.factory = new TraversalStrategy(this.loader, this);
+    }
+
+    /**
+     * Instantiates a new gremlin traversal.
+     *
+     * @param loader the loader
+     * @param start the start
+     */
+    public GremlinTraversal(Loader loader, GraphTraversalSource source, Vertex start) {
+        super(loader, source, start);
+        this.factory = new TraversalStrategy(this.loader, this);
+    }
+
+    protected GremlinTraversal(List traversal, Loader loader, GraphTraversalSource source,
+            GremlinQueryBuilder gtb) {
+        super(loader, source);
+        this.list = traversal;
+        this.stepIndex = gtb.getStepIndex();
+        this.parentStepIndex = gtb.getParentStepIndex();
+        this.containerStepIndex = gtb.getContainerStepIndex();
+        this.factory = new TraversalStrategy(this.loader, this);
+        this.start = gtb.getStart();
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException {
+        return factory.buildURIParser(uri);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromRelationship(Introspector relationship)
+            throws UnsupportedEncodingException, AAIException {
+        return factory.buildRelationshipParser(relationship);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException {
+        return factory.buildURIParser(uri, queryParams);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromObjectName(String objName) {
+        return factory.buildObjectNameParser(objName);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder newInstance(Vertex start) {
+        return new GremlinTraversal<>(loader, source, start);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder newInstance() {
+        return new GremlinTraversal<>(loader, source);
+    }
+
+    @Override
+    protected QueryBuilder cloneQueryAtStep(int index) {
+
+        int idx = index;
+
+        if (idx == 0) {
+            idx = stepIndex;
+        }
+
+        List newList = new ArrayList<>();
+        for (int i = 0; i < idx; i++) {
+            newList.add(this.list.get(i));
+        }
+
+        return new GremlinTraversal<>(newList, loader, source, this);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinUnique.java b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinUnique.java
index da01d2d6..2b117c49 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinUnique.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinUnique.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
 import java.io.UnsupportedEncodingException;
@@ -28,7 +29,6 @@ import javax.ws.rs.core.MultivaluedMap;
 
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -40,101 +40,103 @@ import org.onap.aai.parsers.query.UniqueStrategy;
  * The Class GremlinUnique.
  */
 public class GremlinUnique extends GremlinQueryBuilder {
-	
-	/**
-	 * Instantiates a new gremlin unique.
-	 *
-	 * @param loader the loader
-	 */
-	public GremlinUnique(Loader loader, GraphTraversalSource source) {
-		super(loader, source);
-		this.factory = new UniqueStrategy(this.loader, this);
-	}
-	
-	/**
-	 * Instantiates a new gremlin unique.
-	 *
-	 * @param loader the loader
-	 * @param start the start
-	 */
-	public GremlinUnique(Loader loader, GraphTraversalSource source, Vertex start) {
-		super(loader, source, start);
-		this.factory = new UniqueStrategy(this.loader, this);
-	}
-	
-	protected GremlinUnique(List traversal, Loader loader, GraphTraversalSource source, GremlinQueryBuilder gtb) {
-		super(loader, source);
-		this.list = traversal;
-		this.stepIndex = gtb.getStepIndex();
-		this.parentStepIndex = gtb.getParentStepIndex();
-		this.containerStepIndex = gtb.getContainerStepIndex();
-		this.factory = new TraversalStrategy(this.loader, this);
-		this.start = gtb.getStart();
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException {
-		return factory.buildURIParser(uri);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromRelationship(Introspector relationship) throws UnsupportedEncodingException, AAIException {
-		return factory.buildRelationshipParser(relationship);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
-			throws UnsupportedEncodingException, AAIException {
-		return factory.buildURIParser(uri, queryParams);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromObjectName(String objName) {
-		return factory.buildObjectNameParser(objName);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder newInstance() {
-		return new GremlinUnique<>(loader, source);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder newInstance(Vertex start) {
-		return new GremlinUnique<>(loader, source, start);
-	}
-	
-	@Override
-	protected QueryBuilder cloneQueryAtStep(int index) {
-		
-		int idx = index;
-		
-		if (idx == 0) {
-			idx = stepIndex;
-		}
-		
-		List newList = new ArrayList<>();
-		for (int i = 0; i < idx; i++) {
-			newList.add(this.list.get(i));
-		}
-		
-		return new GremlinUnique<>(newList, loader, source, this);
-	}
+
+    /**
+     * Instantiates a new gremlin unique.
+     *
+     * @param loader the loader
+     */
+    public GremlinUnique(Loader loader, GraphTraversalSource source) {
+        super(loader, source);
+        this.factory = new UniqueStrategy(this.loader, this);
+    }
+
+    /**
+     * Instantiates a new gremlin unique.
+     *
+     * @param loader the loader
+     * @param start the start
+     */
+    public GremlinUnique(Loader loader, GraphTraversalSource source, Vertex start) {
+        super(loader, source, start);
+        this.factory = new UniqueStrategy(this.loader, this);
+    }
+
+    protected GremlinUnique(List traversal, Loader loader, GraphTraversalSource source,
+            GremlinQueryBuilder gtb) {
+        super(loader, source);
+        this.list = traversal;
+        this.stepIndex = gtb.getStepIndex();
+        this.parentStepIndex = gtb.getParentStepIndex();
+        this.containerStepIndex = gtb.getContainerStepIndex();
+        this.factory = new TraversalStrategy(this.loader, this);
+        this.start = gtb.getStart();
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException {
+        return factory.buildURIParser(uri);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromRelationship(Introspector relationship)
+            throws UnsupportedEncodingException, AAIException {
+        return factory.buildRelationshipParser(relationship);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException {
+        return factory.buildURIParser(uri, queryParams);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromObjectName(String objName) {
+        return factory.buildObjectNameParser(objName);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder newInstance() {
+        return new GremlinUnique<>(loader, source);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder newInstance(Vertex start) {
+        return new GremlinUnique<>(loader, source, start);
+    }
+
+    @Override
+    protected QueryBuilder cloneQueryAtStep(int index) {
+
+        int idx = index;
+
+        if (idx == 0) {
+            idx = stepIndex;
+        }
+
+        List newList = new ArrayList<>();
+        for (int i = 0; i < idx; i++) {
+            newList.add(this.list.get(i));
+        }
+
+        return new GremlinUnique<>(newList, loader, source, this);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/MissingOptionalParameter.java b/aai-core/src/main/java/org/onap/aai/query/builder/MissingOptionalParameter.java
index 8ce71e96..3b03656c 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/MissingOptionalParameter.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/MissingOptionalParameter.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
 /*-
@@ -41,13 +42,14 @@ package org.onap.aai.query.builder;
 
 public class MissingOptionalParameter {
 
-	    private MissingOptionalParameter() {}
+    private MissingOptionalParameter() {
+    }
 
-	    private static class Helper {
-	        static final MissingOptionalParameter INSTANCE = new MissingOptionalParameter();
-	    }
+    private static class Helper {
+        static final MissingOptionalParameter INSTANCE = new MissingOptionalParameter();
+    }
 
-	    public static MissingOptionalParameter getInstance() {
-	        return Helper.INSTANCE;
-	    }
-	}
+    public static MissingOptionalParameter getInstance() {
+        return Helper.INSTANCE;
+    }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java
index 68cfd5fc..a214811c 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java
@@ -17,8 +17,17 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
@@ -26,6 +35,10 @@ import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.onap.aai.config.SpringContextAware;
 import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.edges.enums.AAIDirection;
+import org.onap.aai.edges.enums.EdgeProperty;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
@@ -33,102 +46,93 @@ import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
 import org.onap.aai.parsers.query.QueryParser;
 import org.onap.aai.parsers.query.QueryParserStrategy;
 import org.springframework.context.ApplicationContext;
-import org.onap.aai.edges.EdgeIngestor;
-import org.onap.aai.edges.enums.AAIDirection;
-import org.onap.aai.edges.enums.EdgeProperty;
-import org.onap.aai.edges.enums.EdgeType;
-
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
 
 /**
  * The Class QueryBuilder.
  */
 public abstract class QueryBuilder implements Iterator {
 
-	protected final GraphTraversalSource source;
-	protected QueryParserStrategy factory = null;
-	protected Loader loader = null;
-	protected EdgeIngestor edgeRules;
-	protected boolean optimize = false;
-	protected Vertex start = null;
-
-	protected int parentStepIndex = 0;
-	protected int containerStepIndex = 0;
-	protected int stepIndex = 0;
-
-	/**
-	 * Instantiates a new query builder.
-	 *
-	 * @param loader the loader
-	 */
-	public QueryBuilder(Loader loader, GraphTraversalSource source) {
-		this.loader = loader;
-		this.source = source;
-		initEdgeIngestor();
-	}
-	
-	/**
-	 * Instantiates a new query builder.
-	 *
-	 * @param loader the loader
-	 * @param start the start
-	 */
-	public QueryBuilder(Loader loader, GraphTraversalSource source, Vertex start) {
-		this.loader = loader;
-		this.start = start;
-		this.source = source;
-		initEdgeIngestor();
-	}
-
-	public void changeLoader(Loader loader) {
-		this.loader = loader;
-	}
-
-	protected abstract QueryBuilder cloneQueryAtStep(int index);
-
-	/**
-	 * Gets the vertices by indexed property.
-	 *
-	 * @param key the key
-	 * @param value the value
-	 * @return the vertices by indexed property
-	 */
-	public QueryBuilder getVerticesByIndexedProperty(String key, Object value) {
-		return this.getVerticesByProperty(key, value);
-	}
-	
-	/**
-	 * Gets the vertices by property.
-	 *
-	 * @param key the key
-	 * @param value the value
-	 * @return the vertices by property
-	 */
-	public abstract QueryBuilder getVerticesByProperty(String key, Object value);
-	
-	/**
-	 * filters by all the values for this property
-	 * @param key
-	 * @param values
-	 * @return vertices that match these values
-	 */
-	public QueryBuilder getVerticesByIndexedProperty(String key, List values) {
-		return this.getVerticesByProperty(key, values);
-	}
-
-	/**
-	 * filters by all the values for this property
-	 * @param key
-	 * @param values
-	 * @return vertices that match these values
-	 */
-	public abstract QueryBuilder getVerticesByProperty(String key, List values);
-	
+    protected final GraphTraversalSource source;
+    protected QueryParserStrategy factory = null;
+    protected Loader loader = null;
+    protected EdgeIngestor edgeRules;
+    protected boolean optimize = false;
+    protected Vertex start = null;
+
+    protected int parentStepIndex = 0;
+    protected int containerStepIndex = 0;
+    protected int stepIndex = 0;
+
+    /**
+     * Instantiates a new query builder.
+     *
+     * @param loader the loader
+     */
+    public QueryBuilder(Loader loader, GraphTraversalSource source) {
+        this.loader = loader;
+        this.source = source;
+        initEdgeIngestor();
+    }
+
+    /**
+     * Instantiates a new query builder.
+     *
+     * @param loader the loader
+     * @param start the start
+     */
+    public QueryBuilder(Loader loader, GraphTraversalSource source, Vertex start) {
+        this.loader = loader;
+        this.start = start;
+        this.source = source;
+        initEdgeIngestor();
+    }
+
+    public void changeLoader(Loader loader) {
+        this.loader = loader;
+    }
+
+    protected abstract QueryBuilder cloneQueryAtStep(int index);
+
+    /**
+     * Gets the vertices by indexed property.
+     *
+     * @param key the key
+     * @param value the value
+     * @return the vertices by indexed property
+     */
+    public QueryBuilder getVerticesByIndexedProperty(String key, Object value) {
+        return this.getVerticesByProperty(key, value);
+    }
+
+    /**
+     * Gets the vertices by property.
+     *
+     * @param key the key
+     * @param value the value
+     * @return the vertices by property
+     */
+    public abstract QueryBuilder getVerticesByProperty(String key, Object value);
+
+    /**
+     * filters by all the values for this property
+     * 
+     * @param key
+     * @param values
+     * @return vertices that match these values
+     */
+    public QueryBuilder getVerticesByIndexedProperty(String key, List values) {
+        return this.getVerticesByProperty(key, values);
+    }
+
+    /**
+     * filters by all the values for this property
+     * 
+     * @param key
+     * @param values
+     * @return vertices that match these values
+     */
+    public abstract QueryBuilder getVerticesByProperty(String key, List values);
+
     /**
      * Gets the vertices that have this property key.
      *
@@ -137,7 +141,7 @@ public abstract class QueryBuilder implements Iterator {
      * @return the vertices by property
      */
     public abstract QueryBuilder getVerticesByProperty(String key);
-    
+
     /**
      * Gets the vertices that do not have this property key.
      *
@@ -147,482 +151,525 @@ public abstract class QueryBuilder implements Iterator {
      */
     public abstract QueryBuilder getVerticesExcludeByProperty(String key);
 
-	/**
-	 * filters by elements that start with the value for this property
-	 * @param key
-	 * @param value
-	 * @return vertices that match these values
-	 */
-	public abstract QueryBuilder getVerticesStartsWithProperty(String key, Object value);
-
-	/**
-	 * Gets the vertices that are excluded by property.
-	 *
-	 * @param key the key
-	 * @param value the value
-	 * @return the vertices by property
-	 */
-	public abstract QueryBuilder getVerticesExcludeByProperty(String key, Object value);
-
-	/**
-	 * filters by all the values for this property and excludes the vertices
-	 * @param key
-	 * @param values
-	 * @return vertices that match these values
-	 */
-	public QueryBuilder getVerticesExcludeByIndexedProperty(String key, List values) {
-		return this.getVerticesExcludeByProperty(key, values);
-	}
-
-	/**
-	 * filters by all the values for this property and excludes the vertices
-	 * @param key
-	 * @param values
-	 * @return vertices that match these values
-	 */
-	public abstract QueryBuilder getVerticesExcludeByProperty(String key, List values);
-
-	/**
-	 * filters by all the values greater than for this property  
+    /**
+     * filters by elements that start with the value for this property
+     * 
+     * @param key
+     * @param value
+     * @return vertices that match these values
+     */
+    public abstract QueryBuilder getVerticesStartsWithProperty(String key, Object value);
+
+    /**
+     * Gets the vertices that are excluded by property.
+     *
+     * @param key the key
+     * @param value the value
+     * @return the vertices by property
+     */
+    public abstract QueryBuilder getVerticesExcludeByProperty(String key, Object value);
+
+    /**
+     * filters by all the values for this property and excludes the vertices
+     * 
+     * @param key
+     * @param values
+     * @return vertices that match these values
+     */
+    public QueryBuilder getVerticesExcludeByIndexedProperty(String key, List values) {
+        return this.getVerticesExcludeByProperty(key, values);
+    }
+
+    /**
+     * filters by all the values for this property and excludes the vertices
+     * 
      * @param key
      * @param values
      * @return vertices that match these values
      */
-    public abstract  QueryBuilder getVerticesGreaterThanProperty(String key, Object value) ;
+    public abstract QueryBuilder getVerticesExcludeByProperty(String key, List values);
 
     /**
-     * filters by all the values less than for this property 
+     * filters by all the values greater than for this property
+     * 
      * @param key
      * @param values
      * @return vertices that match these values
      */
-    
-    public abstract  QueryBuilder getVerticesLessThanProperty(String key, Object value) ;
-
-    /**
-	 * Gets the child vertices from parent.
-	 *
-	 * @param parentKey the parent key
-	 * @param parentValue the parent value
-	 * @param childType the child type
-	 * @return the child vertices from parent
-	 */
-	public abstract QueryBuilder getChildVerticesFromParent(String parentKey, String parentValue, String childType);
-		
-	/**
-	 * Gets the typed vertices by map.
-	 *
-	 * @param type the type
-	 * @param map the map
-	 * @return the typed vertices by map
-	 */
-	public abstract QueryBuilder getTypedVerticesByMap(String type, Map map);
-
-	/**
-	 * Creates the DB query.
-	 *
-	 * @param obj the obj
-	 * @return the query builder
-	 */
-	public QueryBuilder createDBQuery(Introspector obj) {
-		this.createKeyQuery(obj);
-		this.createContainerQuery(obj);
-		return (QueryBuilder) this;
-	}
-	
-	/**
-	 * Creates the key query.
-	 *
-	 * @param obj the obj
-	 * @return the query builder
-	 */
-	public abstract QueryBuilder createKeyQuery(Introspector obj);
-	
-	/**
-	 * Creates the container query.
-	 *
-	 * @param obj the obj
-	 * @return the query builder
-	 */
-	public abstract QueryBuilder createContainerQuery(Introspector obj);
-	
-	/**
-	 * Creates the edge traversal.
-	 *
-	 * @param parent the parent
-	 * @param child the child
-	 * @return the query builder
-	 */
-	public abstract QueryBuilder createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException;
-
-	public abstract QueryBuilder getVerticesByBooleanProperty(String key, Object value);
-	
-	public QueryBuilder getVerticesByBooleanProperty(String key, MissingOptionalParameter value) {
-		return (QueryBuilder) this;
-		}
-	/**
-	 * Creates the private edge traversal.
-	 *
-	 * @param parent the parent
-	 * @param child the child
-	 * @return the query builder
-	 */
-	public abstract QueryBuilder createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException;
-
-	/**
-	 * Creates the edge traversal.
-	 *
-	 * @param parent the parent
-	 * @param child the child
-	 * @return the query builder
-	 */
-	public QueryBuilder createEdgeTraversal(EdgeType type, Vertex parent, Introspector child) throws AAIException {
-		String nodeType = parent.property(AAIProperties.NODE_TYPE).orElse(null);
-		this.createEdgeTraversal(type, nodeType, child.getDbName());
-		return (QueryBuilder) this;
-	}
-
-	/**
-	 *
-	 * @param type
-	 * @param outNodeType
-	 * @param inNodeType
-	 * @return
-	 * @throws AAIException
-	 */
-	public QueryBuilder createEdgeTraversal(EdgeType type, String outNodeType, String inNodeType) throws AAIException {
-		Introspector out = loader.introspectorFromName(outNodeType);
-		Introspector in = loader.introspectorFromName(inNodeType);
-
-		return createEdgeTraversal(type, out, in);
-	}
-
-	/**
-	 *
-	 * @param edgeType
-	 * @param outNodeType
-	 * @param inNodeType
-	 * @return
-	 * @throws AAIException
-	 */
-	public QueryBuilder createEdgeTraversal(String edgeType, String outNodeType, String inNodeType) throws AAIException {
-		/*
-		 * When the optional parameter edgetype is sent it is a string that needs to be converted to Enum
-		 */
-		EdgeType type = EdgeType.valueOf(edgeType);
-		Introspector out = loader.introspectorFromName(outNodeType);
-		Introspector in = loader.introspectorFromName(inNodeType);
-
-		return createEdgeTraversal(type, out, in);
-	}
-	
-	/**
-	 *
-	 * @param MissingOptionalParameter
-	 * @param outNodeType
-	 * @param inNodeType
-	 * @return
-	 * @throws AAIException
-	 */
-	public QueryBuilder createEdgeTraversal(MissingOptionalParameter edgeType, String outNodeType, String inNodeType) throws AAIException {
-		/*
-		 * When no optional parameter edgetype is sent get all edges between the 2 nodetypes
-		 */
-		return this.createEdgeTraversal(outNodeType, inNodeType);	
-	}
-	
-	public QueryBuilder createEdgeTraversal(String outNodeType, String inNodeType) throws AAIException {
-
-		Introspector out = loader.introspectorFromName(outNodeType);
-		Introspector in = loader.introspectorFromName(inNodeType);
-
-		QueryBuilder cousinBuilder = null;
-		QueryBuilder treeBuilder   = null;
-		QueryBuilder queryBuilder  = null;
-
-		try {
-			cousinBuilder = this.newInstance().createEdgeTraversal(EdgeType.COUSIN, out, in);
-		} catch (AAIException e) {
-		}
-
-		if(cousinBuilder != null){
-			try {
-				treeBuilder = this.newInstance().createEdgeTraversal(EdgeType.TREE, out, in);
-			} catch (AAIException e) {
-			}
-			if(treeBuilder != null){
-				queryBuilder = this.union(new QueryBuilder[]{cousinBuilder, treeBuilder});
-			} else {
-				queryBuilder = this.union(new QueryBuilder[]{cousinBuilder});
-			}
-		} else {
-			treeBuilder = this.newInstance().createEdgeTraversal(EdgeType.TREE, out, in);
-			queryBuilder = this.union(new QueryBuilder[]{treeBuilder});
-		}
-
-
-		return queryBuilder;
-	}
-
-	public QueryBuilder createPrivateEdgeTraversal(EdgeType type, String outNodeType, String inNodeType) throws AAIException {
-		Introspector out = loader.introspectorFromName(outNodeType);
-		Introspector in = loader.introspectorFromName(inNodeType);
-		return createPrivateEdgeTraversal(type, out, in);
-	}
-
-	/**
-	 *
-	 * @param type
-	 * @param outNodeType
-	 * @param inNodeType
-	 * @param labels
-	 * @return
-	 * @throws AAIException
-	 */
-	public QueryBuilder createEdgeTraversalWithLabels(EdgeType type, String outNodeType, String inNodeType, List labels) throws AAIException {
-		Introspector out = loader.introspectorFromName(outNodeType);
-		Introspector in = loader.introspectorFromName(inNodeType);
-
-		return createEdgeTraversalWithLabels(type, out, in, labels);
-	}
-
-	/**
-	 *
-	 * @param type
-	 * @param out
-	 * @param in
-	 * @param labels
-	 * @return
-	 */
-	public abstract QueryBuilder createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, List labels) throws AAIException;
-
-	/**
-	 *
-	 * @param type
-	 * @param outNodeType
-	 * @param inNodeType
-	 * @return
-	 * @throws AAIException
-	 */
-	public QueryBuilder getEdgesBetween(EdgeType type, String outNodeType, String inNodeType) throws AAIException {
-		this.getEdgesBetweenWithLabels(type, outNodeType, inNodeType, null);
-
-		return (QueryBuilder)this;
-
-	}
-	/**
-	 *
-	 * @param type
-	 * @param outNodeType
-	 * @param inNodeType
-	 * @param labels
-	 * @return
-	 * @throws AAIException
-	 */
-	public abstract QueryBuilder getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, List labels) throws AAIException;
-
-	/**
-	 * Creates the query from URI.
-	 *
-	 * @param uri the uri
-	 * @return the query parser
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public abstract QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException;
-	
-	/**
-	 * Creates the query from URI.
-	 *
-	 * @param uri the uri
-	 * @param queryParams the query params
-	 * @return the query parser
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public abstract QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams) throws UnsupportedEncodingException, AAIException;
-
-	/**
-	 * Creates a queryparser from a given object name.
-	 * 
-	 * @param objName - name of the object type as it appears in the database
-	 * @return
-	 */
-	public abstract QueryParser createQueryFromObjectName(String objName);
-	
-	/**
-	 * Creates the query from relationship.
-	 *
-	 * @param relationship the relationship
-	 * @return the query parser
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	public abstract QueryParser createQueryFromRelationship(Introspector relationship) throws UnsupportedEncodingException, AAIException;
-
-	/**
-	 * Gets the parent query.
-	 *
-	 * @return the parent query
-	 */
-	public abstract QueryBuilder getParentQuery();
-	
-	/**
-	 * Gets the query.
-	 *
-	 * @return the query
-	 */
-	public abstract  E2 getQuery();
-	
-	/**
-	 * Form boundary.
-	 */
-	public abstract void markParentBoundary();
-	
-	public abstract QueryBuilder limit(long amount);
-
-	/**
-	 * New instance.
-	 *
-	 * @param start the start
-	 * @return the query builder
-	 */
-	public abstract QueryBuilder newInstance(Vertex start);
-	
-	/**
-	 * New instance.
-	 *
-	 * @return the query builder
-	 */
-	public abstract QueryBuilder newInstance();
-	
-	/**
-	 * Gets the start.
-	 *
-	 * @return the start
-	 */
-	public abstract Vertex getStart();
-
-	protected Object correctObjectType(Object obj) {
-		
-		if (obj != null && obj.getClass().equals(Long.class)) {
-			return new Integer(obj.toString());
-		}
-		
-		return obj;
-	}
-	/**
-	 * uses all fields in the introspector to create a query
-	 * 
-	 * @param obj
-	 * @return
-	 */
-	public abstract QueryBuilder exactMatchQuery(Introspector obj);
-
-	/**
-	 * lets you join any number of QueryBuilders
-	 * be careful about starting with a union it will not use indexes
-	 * @param builder
-	 * @return
-	 */
-	public abstract QueryBuilder union(QueryBuilder... builder);
-	
-	public abstract QueryBuilder where(QueryBuilder... builder);
-	
-	public abstract QueryBuilder or(QueryBuilder... builder);
-	
-	public abstract QueryBuilder store(String name);
-	public abstract QueryBuilder cap(String name);
-	public abstract QueryBuilder unfold();
-	public abstract QueryBuilder dedup();
-	public abstract QueryBuilder emit();
-	public abstract QueryBuilder repeat(QueryBuilder builder);
-	public abstract QueryBuilder outE();
-	public abstract QueryBuilder inE();
-	public abstract QueryBuilder inV();
-	public abstract QueryBuilder outV();
-	public abstract QueryBuilder not(QueryBuilder builder);
-	public abstract QueryBuilder as(String name);
-	public abstract QueryBuilder select(String name);
-	public abstract QueryBuilder select(String... names);
-	public abstract QueryBuilder until(QueryBuilder builder);
-	public abstract QueryBuilder groupCount();
-	public abstract QueryBuilder by(String name);
-	public abstract QueryBuilder both();
-	public abstract QueryBuilder tree();
-	
-	/**
-	 * Used to prevent the traversal from repeating its path through the graph.
-	 * See http://tinkerpop.apache.org/docs/3.0.1-incubating/#simplepath-step for more info.
-	 * 
-	 * @return a QueryBuilder with the simplePath step appended to its traversal
-	 */
-	public abstract QueryBuilder simplePath();
-
-	/**
-	 *
-	 * @return QueryBuilder with the path step appended to its traversal
-	 */
-	public abstract QueryBuilder path();
-	
- 	public abstract void markContainer();
-
-	public abstract QueryBuilder getContainerQuery();
-
-	public abstract List toList();
-
-	/**
-	 * Used to skip step if there is an optional property missing.
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public QueryBuilder getVerticesByProperty(String key, MissingOptionalParameter value) {
-		return (QueryBuilder) this;
-	}
-
-	/**
-	 * TODO the edge direction is hardcoded here, make it more generic
-	 * Returns the parent edge of the vertex
-	 * @return
-	 */
-	public QueryBuilder getParentEdge() {
-		this.outE().has(EdgeProperty.CONTAINS.toString(), AAIDirection.IN.toString());
-		return (QueryBuilder)this;
-	}
-
-	/**
-	 * TODO the edge direction is hardcoded here, make it more generic
-	 * Returns the parent vertex of the vertex
-	 * @return
-	 */
-	public QueryBuilder getParentVertex() {
-		this.getParentEdge().inV();
-		return (QueryBuilder)this;
-	}
-
-	protected abstract QueryBuilder has(String key, String value);
-	
-	protected void initEdgeIngestor() {
-		//TODO proper spring wiring, but that requires a lot of refactoring so for now we have this
-		ApplicationContext ctx = SpringContextAware.getApplicationContext();
-		EdgeIngestor ei = ctx.getBean(EdgeIngestor.class);
-		setEdgeIngestor(ei);
-	}
-	
-	protected void setEdgeIngestor(EdgeIngestor ei) {
-		this.edgeRules = ei;
-	}
-
-	public QueryBuilder getVerticesByNumberProperty(String key, Object value) {
-		return getVerticesByProperty(key, value);
-	}
+    public abstract QueryBuilder getVerticesGreaterThanProperty(String key, Object value);
+
+    /**
+     * filters by all the values less than for this property
+     * 
+     * @param key
+     * @param values
+     * @return vertices that match these values
+     */
+
+    public abstract QueryBuilder getVerticesLessThanProperty(String key, Object value);
+
+    /**
+     * Gets the child vertices from parent.
+     *
+     * @param parentKey the parent key
+     * @param parentValue the parent value
+     * @param childType the child type
+     * @return the child vertices from parent
+     */
+    public abstract QueryBuilder getChildVerticesFromParent(String parentKey, String parentValue,
+            String childType);
+
+    /**
+     * Gets the typed vertices by map.
+     *
+     * @param type the type
+     * @param map the map
+     * @return the typed vertices by map
+     */
+    public abstract QueryBuilder getTypedVerticesByMap(String type, Map map);
+
+    /**
+     * Creates the DB query.
+     *
+     * @param obj the obj
+     * @return the query builder
+     */
+    public QueryBuilder createDBQuery(Introspector obj) {
+        this.createKeyQuery(obj);
+        this.createContainerQuery(obj);
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * Creates the key query.
+     *
+     * @param obj the obj
+     * @return the query builder
+     */
+    public abstract QueryBuilder createKeyQuery(Introspector obj);
+
+    /**
+     * Creates the container query.
+     *
+     * @param obj the obj
+     * @return the query builder
+     */
+    public abstract QueryBuilder createContainerQuery(Introspector obj);
+
+    /**
+     * Creates the edge traversal.
+     *
+     * @param parent the parent
+     * @param child the child
+     * @return the query builder
+     */
+    public abstract QueryBuilder createEdgeTraversal(EdgeType type, Introspector parent, Introspector child)
+            throws AAIException;
+
+    public abstract QueryBuilder getVerticesByBooleanProperty(String key, Object value);
+
+    public QueryBuilder getVerticesByBooleanProperty(String key, MissingOptionalParameter value) {
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * Creates the private edge traversal.
+     *
+     * @param parent the parent
+     * @param child the child
+     * @return the query builder
+     */
+    public abstract QueryBuilder createPrivateEdgeTraversal(EdgeType type, Introspector parent,
+            Introspector child) throws AAIException;
+
+    /**
+     * Creates the edge traversal.
+     *
+     * @param parent the parent
+     * @param child the child
+     * @return the query builder
+     */
+    public QueryBuilder createEdgeTraversal(EdgeType type, Vertex parent, Introspector child)
+            throws AAIException {
+        String nodeType = parent.property(AAIProperties.NODE_TYPE).orElse(null);
+        this.createEdgeTraversal(type, nodeType, child.getDbName());
+        return (QueryBuilder) this;
+    }
+
+    /**
+     *
+     * @param type
+     * @param outNodeType
+     * @param inNodeType
+     * @return
+     * @throws AAIException
+     */
+    public QueryBuilder createEdgeTraversal(EdgeType type, String outNodeType, String inNodeType)
+            throws AAIException {
+        Introspector out = loader.introspectorFromName(outNodeType);
+        Introspector in = loader.introspectorFromName(inNodeType);
+
+        return createEdgeTraversal(type, out, in);
+    }
+
+    /**
+     *
+     * @param edgeType
+     * @param outNodeType
+     * @param inNodeType
+     * @return
+     * @throws AAIException
+     */
+    public QueryBuilder createEdgeTraversal(String edgeType, String outNodeType, String inNodeType)
+            throws AAIException {
+        /*
+         * When the optional parameter edgetype is sent it is a string that needs to be converted to Enum
+         */
+        EdgeType type = EdgeType.valueOf(edgeType);
+        Introspector out = loader.introspectorFromName(outNodeType);
+        Introspector in = loader.introspectorFromName(inNodeType);
+
+        return createEdgeTraversal(type, out, in);
+    }
+
+    /**
+     *
+     * @param MissingOptionalParameter
+     * @param outNodeType
+     * @param inNodeType
+     * @return
+     * @throws AAIException
+     */
+    public QueryBuilder createEdgeTraversal(MissingOptionalParameter edgeType, String outNodeType,
+            String inNodeType) throws AAIException {
+        /*
+         * When no optional parameter edgetype is sent get all edges between the 2 nodetypes
+         */
+        return this.createEdgeTraversal(outNodeType, inNodeType);
+    }
+
+    public QueryBuilder createEdgeTraversal(String outNodeType, String inNodeType) throws AAIException {
+
+        Introspector out = loader.introspectorFromName(outNodeType);
+        Introspector in = loader.introspectorFromName(inNodeType);
+
+        QueryBuilder cousinBuilder = null;
+        QueryBuilder treeBuilder = null;
+        QueryBuilder queryBuilder = null;
+
+        try {
+            cousinBuilder = this.newInstance().createEdgeTraversal(EdgeType.COUSIN, out, in);
+        } catch (AAIException e) {
+        }
+
+        if (cousinBuilder != null) {
+            try {
+                treeBuilder = this.newInstance().createEdgeTraversal(EdgeType.TREE, out, in);
+            } catch (AAIException e) {
+            }
+            if (treeBuilder != null) {
+                queryBuilder = this.union(new QueryBuilder[] {cousinBuilder, treeBuilder});
+            } else {
+                queryBuilder = this.union(new QueryBuilder[] {cousinBuilder});
+            }
+        } else {
+            treeBuilder = this.newInstance().createEdgeTraversal(EdgeType.TREE, out, in);
+            queryBuilder = this.union(new QueryBuilder[] {treeBuilder});
+        }
+
+        return queryBuilder;
+    }
+
+    public QueryBuilder createPrivateEdgeTraversal(EdgeType type, String outNodeType, String inNodeType)
+            throws AAIException {
+        Introspector out = loader.introspectorFromName(outNodeType);
+        Introspector in = loader.introspectorFromName(inNodeType);
+        return createPrivateEdgeTraversal(type, out, in);
+    }
+
+    /**
+     *
+     * @param type
+     * @param outNodeType
+     * @param inNodeType
+     * @param labels
+     * @return
+     * @throws AAIException
+     */
+    public QueryBuilder createEdgeTraversalWithLabels(EdgeType type, String outNodeType, String inNodeType,
+            List labels) throws AAIException {
+        Introspector out = loader.introspectorFromName(outNodeType);
+        Introspector in = loader.introspectorFromName(inNodeType);
+
+        return createEdgeTraversalWithLabels(type, out, in, labels);
+    }
+
+    /**
+     *
+     * @param type
+     * @param out
+     * @param in
+     * @param labels
+     * @return
+     */
+    public abstract QueryBuilder createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in,
+            List labels) throws AAIException;
+
+    /**
+     *
+     * @param type
+     * @param outNodeType
+     * @param inNodeType
+     * @return
+     * @throws AAIException
+     */
+    public QueryBuilder getEdgesBetween(EdgeType type, String outNodeType, String inNodeType)
+            throws AAIException {
+        this.getEdgesBetweenWithLabels(type, outNodeType, inNodeType, null);
+
+        return (QueryBuilder) this;
+
+    }
+
+    /**
+     *
+     * @param type
+     * @param outNodeType
+     * @param inNodeType
+     * @param labels
+     * @return
+     * @throws AAIException
+     */
+    public abstract QueryBuilder getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType,
+            List labels) throws AAIException;
+
+    /**
+     * Creates the query from URI.
+     *
+     * @param uri the uri
+     * @return the query parser
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public abstract QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException;
+
+    /**
+     * Creates the query from URI.
+     *
+     * @param uri the uri
+     * @param queryParams the query params
+     * @return the query parser
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public abstract QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException;
+
+    /**
+     * Creates a queryparser from a given object name.
+     * 
+     * @param objName - name of the object type as it appears in the database
+     * @return
+     */
+    public abstract QueryParser createQueryFromObjectName(String objName);
+
+    /**
+     * Creates the query from relationship.
+     *
+     * @param relationship the relationship
+     * @return the query parser
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     * @throws AAIException the AAI exception
+     */
+    public abstract QueryParser createQueryFromRelationship(Introspector relationship)
+            throws UnsupportedEncodingException, AAIException;
+
+    /**
+     * Gets the parent query.
+     *
+     * @return the parent query
+     */
+    public abstract QueryBuilder getParentQuery();
+
+    /**
+     * Gets the query.
+     *
+     * @return the query
+     */
+    public abstract  E2 getQuery();
+
+    /**
+     * Form boundary.
+     */
+    public abstract void markParentBoundary();
+
+    public abstract QueryBuilder limit(long amount);
+
+    /**
+     * New instance.
+     *
+     * @param start the start
+     * @return the query builder
+     */
+    public abstract QueryBuilder newInstance(Vertex start);
+
+    /**
+     * New instance.
+     *
+     * @return the query builder
+     */
+    public abstract QueryBuilder newInstance();
+
+    /**
+     * Gets the start.
+     *
+     * @return the start
+     */
+    public abstract Vertex getStart();
+
+    protected Object correctObjectType(Object obj) {
+
+        if (obj != null && obj.getClass().equals(Long.class)) {
+            return new Integer(obj.toString());
+        }
+
+        return obj;
+    }
+
+    /**
+     * uses all fields in the introspector to create a query
+     * 
+     * @param obj
+     * @return
+     */
+    public abstract QueryBuilder exactMatchQuery(Introspector obj);
+
+    /**
+     * lets you join any number of QueryBuilders
+     * be careful about starting with a union it will not use indexes
+     * 
+     * @param builder
+     * @return
+     */
+    public abstract QueryBuilder union(QueryBuilder... builder);
+
+    public abstract QueryBuilder where(QueryBuilder... builder);
+
+    public abstract QueryBuilder or(QueryBuilder... builder);
+
+    public abstract QueryBuilder store(String name);
+
+    public abstract QueryBuilder cap(String name);
+
+    public abstract QueryBuilder unfold();
+
+    public abstract QueryBuilder dedup();
+
+    public abstract QueryBuilder emit();
+
+    public abstract QueryBuilder repeat(QueryBuilder builder);
+
+    public abstract QueryBuilder outE();
+
+    public abstract QueryBuilder inE();
+
+    public abstract QueryBuilder inV();
+
+    public abstract QueryBuilder outV();
+
+    public abstract QueryBuilder not(QueryBuilder builder);
+
+    public abstract QueryBuilder as(String name);
+
+    public abstract QueryBuilder select(String name);
+
+    public abstract QueryBuilder select(String... names);
+
+    public abstract QueryBuilder until(QueryBuilder builder);
+
+    public abstract QueryBuilder groupCount();
+
+    public abstract QueryBuilder by(String name);
+
+    public abstract QueryBuilder both();
+
+    public abstract QueryBuilder tree();
+
+    /**
+     * Used to prevent the traversal from repeating its path through the graph.
+     * See http://tinkerpop.apache.org/docs/3.0.1-incubating/#simplepath-step for more info.
+     * 
+     * @return a QueryBuilder with the simplePath step appended to its traversal
+     */
+    public abstract QueryBuilder simplePath();
+
+    /**
+     *
+     * @return QueryBuilder with the path step appended to its traversal
+     */
+    public abstract QueryBuilder path();
+
+    public abstract void markContainer();
+
+    public abstract QueryBuilder getContainerQuery();
+
+    public abstract List toList();
+
+    /**
+     * Used to skip step if there is an optional property missing.
+     * 
+     * @param key
+     * @param value
+     * @return
+     */
+    public QueryBuilder getVerticesByProperty(String key, MissingOptionalParameter value) {
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * TODO the edge direction is hardcoded here, make it more generic
+     * Returns the parent edge of the vertex
+     * 
+     * @return
+     */
+    public QueryBuilder getParentEdge() {
+        this.outE().has(EdgeProperty.CONTAINS.toString(), AAIDirection.IN.toString());
+        return (QueryBuilder) this;
+    }
+
+    /**
+     * TODO the edge direction is hardcoded here, make it more generic
+     * Returns the parent vertex of the vertex
+     * 
+     * @return
+     */
+    public QueryBuilder getParentVertex() {
+        this.getParentEdge().inV();
+        return (QueryBuilder) this;
+    }
+
+    protected abstract QueryBuilder has(String key, String value);
+
+    protected void initEdgeIngestor() {
+        // TODO proper spring wiring, but that requires a lot of refactoring so for now we have this
+        ApplicationContext ctx = SpringContextAware.getApplicationContext();
+        EdgeIngestor ei = ctx.getBean(EdgeIngestor.class);
+        setEdgeIngestor(ei);
+    }
+
+    protected void setEdgeIngestor(EdgeIngestor ei) {
+        this.edgeRules = ei;
+    }
+
+    public QueryBuilder getVerticesByNumberProperty(String key, Object value) {
+        return getVerticesByProperty(key, value);
+    }
 
     public QueryBuilder getVerticesByNumberProperty(String key) {
-    	return getVerticesByProperty(key);
+        return getVerticesByProperty(key);
     }
-    
+
     public QueryBuilder getVerticesByNumberProperty(String key, MissingOptionalParameter value) {
-		return getVerticesByProperty(key, value);
-	}
+        return getVerticesByProperty(key, value);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/TraversalQuery.java b/aai-core/src/main/java/org/onap/aai/query/builder/TraversalQuery.java
index 21d8eb50..cf99fd10 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/TraversalQuery.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/TraversalQuery.java
@@ -17,140 +17,144 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.util.List;
+
+import javax.ws.rs.core.MultivaluedMap;
+
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 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;
+import org.onap.aai.edges.enums.EdgeType;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.parsers.query.QueryParser;
 import org.onap.aai.parsers.query.TraversalStrategy;
-import org.onap.aai.edges.enums.EdgeType;
-
-import javax.ws.rs.core.MultivaluedMap;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.util.List;
 
 /**
  * The Class TraversalQuery.
  */
 public class TraversalQuery extends GraphTraversalBuilder {
 
-	/**
-	 * Instantiates a new traversal query.
-	 *
-	 * @param loader the loader
-	 */
-	public TraversalQuery(Loader loader, GraphTraversalSource source) {
-		super(loader, source);
-		this.factory = new TraversalStrategy(this.loader, this);
-	}
-	
-	/**
-	 * Instantiates a new traversal query.
-	 *
-	 * @param loader the loader
-	 * @param start the start
-	 */
-	public TraversalQuery(Loader loader, GraphTraversalSource source, Vertex start) {
-		super(loader, source, start);
-		this.factory = new TraversalStrategy(this.loader, this);
-	}
-	
-	protected TraversalQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source, GraphTraversalBuilder gtb) {
-		super(loader, source);
-		this.traversal = traversal;
-		this.stepIndex = gtb.getStepIndex();
-		this.parentStepIndex = gtb.getParentStepIndex();
-		this.containerStepIndex = gtb.getContainerStepIndex();
-		this.factory = new TraversalStrategy(this.loader, this);
-		this.start = gtb.getStart();
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException {
-		return factory.buildURIParser(uri);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromRelationship(Introspector relationship) throws UnsupportedEncodingException, AAIException {
-		return factory.buildRelationshipParser(relationship);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
-			throws UnsupportedEncodingException, AAIException {
-		return factory.buildURIParser(uri, queryParams);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryParser createQueryFromObjectName(String objName) {
-		return factory.buildObjectNameParser(objName);
-	}
-
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder newInstance(Vertex start) {
-		return new TraversalQuery<>(loader, source, start);
-	}
-	
-	/**
-	 * @{inheritDoc}
-	 */
-	@Override
-	public QueryBuilder newInstance() {
-		return new TraversalQuery<>(loader, source);
-	}
-	
-	@Override
-	protected QueryBuilder cloneQueryAtStep(int index) {
-		GraphTraversal.Admin cloneAdmin = getCloneAdmin(index);
-		return new TraversalQuery<>(cloneAdmin, loader, source, this);
-	}
-
-	protected GraphTraversal.Admin getCloneAdmin(int index) {
-		int idx = index;
-
-		if (idx == 0) {
-			idx = stepIndex;
-		}
-
-		GraphTraversal clone = this.traversal.asAdmin().clone();
-		GraphTraversal.Admin cloneAdmin = clone.asAdmin();
-		List steps = cloneAdmin.getSteps();
-
-		for (int i = steps.size()-1; i >= idx; i--) {
-			cloneAdmin.removeStep(i);
-		}
-		return cloneAdmin;
-	}
-
-	@Override
-	protected QueryBuilder removeQueryStepsBetween(int start, int end) {
-		GraphTraversal clone = this.traversal.asAdmin().clone();
-		GraphTraversal.Admin cloneAdmin = clone.asAdmin();
-
-		for (int i = end-2; i >= start; i--) {
-			cloneAdmin.removeStep(i);
-		}
-		return new TraversalQuery<>(cloneAdmin, loader, source, this);
-	}
+    /**
+     * Instantiates a new traversal query.
+     *
+     * @param loader the loader
+     */
+    public TraversalQuery(Loader loader, GraphTraversalSource source) {
+        super(loader, source);
+        this.factory = new TraversalStrategy(this.loader, this);
+    }
+
+    /**
+     * Instantiates a new traversal query.
+     *
+     * @param loader the loader
+     * @param start the start
+     */
+    public TraversalQuery(Loader loader, GraphTraversalSource source, Vertex start) {
+        super(loader, source, start);
+        this.factory = new TraversalStrategy(this.loader, this);
+    }
+
+    protected TraversalQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source,
+            GraphTraversalBuilder gtb) {
+        super(loader, source);
+        this.traversal = traversal;
+        this.stepIndex = gtb.getStepIndex();
+        this.parentStepIndex = gtb.getParentStepIndex();
+        this.containerStepIndex = gtb.getContainerStepIndex();
+        this.factory = new TraversalStrategy(this.loader, this);
+        this.start = gtb.getStart();
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException {
+        return factory.buildURIParser(uri);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromRelationship(Introspector relationship)
+            throws UnsupportedEncodingException, AAIException {
+        return factory.buildRelationshipParser(relationship);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams)
+            throws UnsupportedEncodingException, AAIException {
+        return factory.buildURIParser(uri, queryParams);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryParser createQueryFromObjectName(String objName) {
+        return factory.buildObjectNameParser(objName);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder newInstance(Vertex start) {
+        return new TraversalQuery<>(loader, source, start);
+    }
+
+    /**
+     * @{inheritDoc}
+     */
+    @Override
+    public QueryBuilder newInstance() {
+        return new TraversalQuery<>(loader, source);
+    }
+
+    @Override
+    protected QueryBuilder cloneQueryAtStep(int index) {
+        GraphTraversal.Admin cloneAdmin = getCloneAdmin(index);
+        return new TraversalQuery<>(cloneAdmin, loader, source, this);
+    }
+
+    protected GraphTraversal.Admin getCloneAdmin(int index) {
+        int idx = index;
+
+        if (idx == 0) {
+            idx = stepIndex;
+        }
+
+        GraphTraversal clone = this.traversal.asAdmin().clone();
+        GraphTraversal.Admin cloneAdmin = clone.asAdmin();
+        List steps = cloneAdmin.getSteps();
+
+        for (int i = steps.size() - 1; i >= idx; i--) {
+            cloneAdmin.removeStep(i);
+        }
+        return cloneAdmin;
+    }
+
+    @Override
+    protected QueryBuilder removeQueryStepsBetween(int start, int end) {
+        GraphTraversal clone = this.traversal.asAdmin().clone();
+        GraphTraversal.Admin cloneAdmin = clone.asAdmin();
+
+        for (int i = end - 2; i >= start; i--) {
+            cloneAdmin.removeStep(i);
+        }
+        return new TraversalQuery<>(cloneAdmin, loader, source, this);
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/TraversalURIOptimizedQuery.java b/aai-core/src/main/java/org/onap/aai/query/builder/TraversalURIOptimizedQuery.java
index 6a247c2a..91d2d084 100644
--- a/aai-core/src/main/java/org/onap/aai/query/builder/TraversalURIOptimizedQuery.java
+++ b/aai-core/src/main/java/org/onap/aai/query/builder/TraversalURIOptimizedQuery.java
@@ -17,8 +17,15 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.query.builder;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
@@ -30,151 +37,149 @@ import org.onap.aai.introspection.Introspector;
 import org.onap.aai.introspection.Loader;
 import org.onap.aai.schema.enums.ObjectMetadata;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
 public class TraversalURIOptimizedQuery extends TraversalQuery {
 
-	protected Map stepToAaiUri = new HashMap<>();
-
-	public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source) {
-		super(loader, source);
-		optimize = true;
-	}
-
-	public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source, Vertex start) {
-		super(loader, source, start);
-		optimize = true;
-	}
-
-	protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source, GraphTraversalBuilder gtb) {
-		super(traversal, loader, source, gtb);
-		optimize = true;
-	}
-
-	protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source, GraphTraversalBuilder gtb, Map stepToAaiUri) {
-		super(traversal, loader, source, gtb);
-		optimize = gtb.optimize;
-		this.stepToAaiUri = stepToAaiUri;
-	}
+    protected Map stepToAaiUri = new HashMap<>();
 
-	@Override
-	protected void executeQuery() {
+    public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source) {
+        super(loader, source);
+        optimize = true;
+    }
 
-		this.completeTraversal = this.traversal.asAdmin().clone();
+    public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source, Vertex start) {
+        super(loader, source, start);
+        optimize = true;
+    }
 
-		if (this.optimize) {
-			this.completeTraversal = this.pivotTraversal(this.completeTraversal);
-		}
+    protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source,
+            GraphTraversalBuilder gtb) {
+        super(traversal, loader, source, gtb);
+        optimize = true;
+    }
 
-		if (start == null) {
-			Traversal.Admin admin = source.V().asAdmin();
-			TraversalHelper.insertTraversal(admin.getEndStep(), completeTraversal, admin);
+    protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source,
+            GraphTraversalBuilder gtb, Map stepToAaiUri) {
+        super(traversal, loader, source, gtb);
+        optimize = gtb.optimize;
+        this.stepToAaiUri = stepToAaiUri;
+    }
 
-			this.completeTraversal = (Traversal.Admin) admin;
+    @Override
+    protected void executeQuery() {
 
-		}
+        this.completeTraversal = this.traversal.asAdmin().clone();
 
-	}
+        if (this.optimize) {
+            this.completeTraversal = this.pivotTraversal(this.completeTraversal);
+        }
 
-	private Traversal.Admin pivotTraversal(Traversal.Admin traversalAdmin) {
+        if (start == null) {
+            Traversal.Admin admin = source.V().asAdmin();
+            TraversalHelper.insertTraversal(admin.getEndStep(), completeTraversal, admin);
 
-		List steps = traversalAdmin.getSteps();
+            this.completeTraversal = (Traversal.Admin) admin;
 
-		Traversal.Admin traversalAdminStart = traversalAdmin.clone();
+        }
 
-		//if we do not have an index or other conditions do no optimization
-		if (stepToAaiUri.isEmpty()) {
-			return traversalAdmin;
-		}
+    }
 
-		int lastURIStepKey = getLastURIStepKey();
+    private Traversal.Admin pivotTraversal(Traversal.Admin traversalAdmin) {
 
-		//clean up traversal steps
-		for (int i = 0; i < steps.size(); i++) {
-			traversalAdminStart.removeStep(0);
-		}
+        List steps = traversalAdmin.getSteps();
 
-		((GraphTraversal)traversalAdminStart).has(AAIProperties.AAI_URI, stepToAaiUri.get(lastURIStepKey));
-		for (int i = lastURIStepKey; i < steps.size(); i++) {
-			traversalAdminStart.addStep(steps.get(i));
-		}
+        Traversal.Admin traversalAdminStart = traversalAdmin.clone();
 
-		return traversalAdminStart;
-	}
+        // if we do not have an index or other conditions do no optimization
+        if (stepToAaiUri.isEmpty()) {
+            return traversalAdmin;
+        }
 
-	@Override
-	public QueryBuilder createKeyQuery(Introspector obj) {
-		super.createKeyQuery(obj);
+        int lastURIStepKey = getLastURIStepKey();
 
-		if (shouldAddStepUri(obj)) {
-			Optional uri = getStepUriFromIntrospector(obj);
-			if (uri.isPresent()) {
-				if (stepToAaiUri.isEmpty()) {
-					stepToAaiUri.put(stepIndex + 1, uri.get());
-				} else {
-					stepToAaiUri.put(stepIndex, uri.get());
-				}
-			}
-		} else {
-			optimize = false;
-			stepToAaiUri = new HashMap<>();
-		}
-		return (QueryBuilder) this;
-	}
+        // clean up traversal steps
+        for (int i = 0; i < steps.size(); i++) {
+            traversalAdminStart.removeStep(0);
+        }
 
-	private boolean shouldAddStepUri(Introspector obj) {
-		boolean shouldOptimize = optimize;
+        ((GraphTraversal) traversalAdminStart).has(AAIProperties.AAI_URI, stepToAaiUri.get(lastURIStepKey));
+        for (int i = lastURIStepKey; i < steps.size(); i++) {
+            traversalAdminStart.addStep(steps.get(i));
+        }
 
-		if (shouldOptimize && start != null) {
-			shouldOptimize = false;
-		}
+        return traversalAdminStart;
+    }
 
-		if (shouldOptimize && stepToAaiUri.isEmpty() && !obj.isTopLevel()) {
-			shouldOptimize = false;
-		}
+    @Override
+    public QueryBuilder createKeyQuery(Introspector obj) {
+        super.createKeyQuery(obj);
 
-		if (shouldOptimize && obj.getMetadata(ObjectMetadata.ABSTRACT) != null) {
-			shouldOptimize = false;
-		}
-
-		return shouldOptimize;
+        if (shouldAddStepUri(obj)) {
+            Optional uri = getStepUriFromIntrospector(obj);
+            if (uri.isPresent()) {
+                if (stepToAaiUri.isEmpty()) {
+                    stepToAaiUri.put(stepIndex + 1, uri.get());
+                } else {
+                    stepToAaiUri.put(stepIndex, uri.get());
+                }
+            }
+        } else {
+            optimize = false;
+            stepToAaiUri = new HashMap<>();
+        }
+        return (QueryBuilder) this;
+    }
 
-	}
+    private boolean shouldAddStepUri(Introspector obj) {
+        boolean shouldOptimize = optimize;
 
-	private Optional getStepUriFromIntrospector(Introspector obj) {
-		String uri = "";
-		try {
-			uri = obj.getURI();
-		} catch (Exception e) {
-		}
+        if (shouldOptimize && start != null) {
+            shouldOptimize = false;
+        }
 
-		if ("".equals(uri)) {
-			return Optional.empty();
-		}
+        if (shouldOptimize && stepToAaiUri.isEmpty() && !obj.isTopLevel()) {
+            shouldOptimize = false;
+        }
+
+        if (shouldOptimize && obj.getMetadata(ObjectMetadata.ABSTRACT) != null) {
+            shouldOptimize = false;
+        }
+
+        return shouldOptimize;
+
+    }
+
+    private Optional getStepUriFromIntrospector(Introspector obj) {
+        String uri = "";
+        try {
+            uri = obj.getURI();
+        } catch (Exception e) {
+        }
 
-		if (!stepToAaiUri.isEmpty()) {
-			uri = stepToAaiUri.get(getLastURIStepKey()) + uri;
-		}
+        if ("".equals(uri)) {
+            return Optional.empty();
+        }
 
-		return Optional.of(uri);
-	}
+        if (!stepToAaiUri.isEmpty()) {
+            uri = stepToAaiUri.get(getLastURIStepKey()) + uri;
+        }
 
-	private int getLastURIStepKey() {
-		return stepToAaiUri.keySet().stream().mapToInt(Integer::intValue).max().getAsInt();
-	}
+        return Optional.of(uri);
+    }
 
-	private Map getStepToAaiUriWithoutStepGreaterThan(final int index) {
-		return stepToAaiUri.entrySet().stream().filter(kv -> kv.getKey() <= index).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
-	}
+    private int getLastURIStepKey() {
+        return stepToAaiUri.keySet().stream().mapToInt(Integer::intValue).max().getAsInt();
+    }
+
+    private Map getStepToAaiUriWithoutStepGreaterThan(final int index) {
+        return stepToAaiUri.entrySet().stream().filter(kv -> kv.getKey() <= index)
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
 
-	@Override
-	protected QueryBuilder cloneQueryAtStep(int index) {
-		GraphTraversal.Admin cloneAdmin = getCloneAdmin(index);
-		return new TraversalURIOptimizedQuery<>(cloneAdmin, loader, source, this, getStepToAaiUriWithoutStepGreaterThan(index));
-	}
+    @Override
+    protected QueryBuilder cloneQueryAtStep(int index) {
+        GraphTraversal.Admin cloneAdmin = getCloneAdmin(index);
+        return new TraversalURIOptimizedQuery<>(cloneAdmin, loader, source, this,
+                getStepToAaiUriWithoutStepGreaterThan(index));
+    }
 
 }
diff --git a/aai-core/src/main/java/org/onap/aai/rest/RestHandlerService.java b/aai-core/src/main/java/org/onap/aai/rest/RestHandlerService.java
index 69525e29..aeb58c4b 100644
--- a/aai-core/src/main/java/org/onap/aai/rest/RestHandlerService.java
+++ b/aai-core/src/main/java/org/onap/aai/rest/RestHandlerService.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.rest;
 
 import java.util.concurrent.Executors;
@@ -25,11 +26,12 @@ import java.util.concurrent.ThreadPoolExecutor;
 public class RestHandlerService {
     private static RestHandlerService single_instance = null;
     public ThreadPoolExecutor executor;
+
     // private constructor restricted to this class itself
-    private RestHandlerService()
-    {
+    private RestHandlerService() {
         executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(50);
     }
+
     /**
      * Gets the single instance of RestHandlerService.
      *
diff --git a/aai-core/src/main/java/org/onap/aai/rest/RestTokens.java b/aai-core/src/main/java/org/onap/aai/rest/RestTokens.java
index d1c4d863..bd471b05 100644
--- a/aai-core/src/main/java/org/onap/aai/rest/RestTokens.java
+++ b/aai-core/src/main/java/org/onap/aai/rest/RestTokens.java
@@ -17,19 +17,20 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.rest;
 
 public enum RestTokens {
 
-	COUSIN("related-to");
-	private final String name;
+    COUSIN("related-to");
+    private final String name;
 
-	private RestTokens(String name) { 
-		this.name = name;
-	}
+    private RestTokens(String name) {
+        this.name = name;
+    }
 
-	@Override
-	public String toString() {
-		return name;
-	}
+    @Override
+    public String toString() {
+        return name;
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/rest/db/DBRequest.java b/aai-core/src/main/java/org/onap/aai/rest/db/DBRequest.java
index c378ae74..1f94fbe2 100644
--- a/aai-core/src/main/java/org/onap/aai/rest/db/DBRequest.java
+++ b/aai-core/src/main/java/org/onap/aai/rest/db/DBRequest.java
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.rest.db;
 
 import java.net.URI;
@@ -35,216 +36,216 @@ import org.onap.aai.restcore.HttpMethod;
  */
 public class DBRequest {
 
-	private final QueryParser parser;
-	
-	private final Introspector introspector;
-	
-	private final HttpHeaders headers;
-	
-	private final String transactionId;
-	
-	private final UriInfo info;
-	
-	private final HttpMethod method;
-	
-	private final URI uri;
-	
-	private final Optional rawRequestContent;
-	
-	private final Optional marshallerProperties;
-
-	
-	/**
-	 * Instantiates a new DB request.
-	 *
-	 * @param method the method
-	 * @param uri the uri
-	 * @param parser the parser
-	 * @param obj the obj
-	 * @param headers the headers
-	 * @param info the info
-	 * @param transactionId the transaction id
-	 */
-	private DBRequest(Builder builder) {
-		this.method = builder.getMethod();
-		this.parser = builder.getParser();
-		this.introspector = builder.getIntrospector();
-		this.headers = builder.getHeaders();
-		this.transactionId = builder.getTransactionId();
-		this.info = builder.getInfo();
-		this.uri = builder.getUri();
-		this.marshallerProperties = builder.getMarshallerProperties();
-		this.rawRequestContent = builder.getRawRequestContent();
-	}
-	
-	/**
-	 * Gets the headers.
-	 *
-	 * @return the headers
-	 */
-	public HttpHeaders getHeaders() {
-		return headers;
-	}
-	
-	
-	/**
-	 * Gets the transaction id.
-	 *
-	 * @return the transaction id
-	 */
-	public String getTransactionId() {
-		return transactionId;
-	}
-	
-	/**
-	 * Gets the info.
-	 *
-	 * @return the info
-	 */
-	public UriInfo getInfo() {
-		return info;
-	}
-	
-	/**
-	 * Gets the parser.
-	 *
-	 * @return the parser
-	 */
-	public QueryParser getParser() {
-		return parser;
-	}
-
-	/**
-	 * Gets the introspector.
-	 *
-	 * @return the introspector
-	 */
-	public Introspector getIntrospector() {
-		return introspector;
-	}
-
-	/**
-	 * Gets the method.
-	 *
-	 * @return the method
-	 */
-	public HttpMethod getMethod() {
-		return method;
-	}
-
-	/**
-	 * Gets the uri.
-	 *
-	 * @return the uri
-	 */
-	public URI getUri() {
-		return uri;
-	}
-	
-	/**
-	 * Gets the raw content.
-	 *
-	 * @return the raw content
-	 */
-	public Optional getRawRequestContent() {
-		return rawRequestContent;
-	}
-	
-	public Optional getMarshallerProperties() {
-		return marshallerProperties;
-	}
-
-
-
-	public static class Builder {
-
-		private QueryParser parser = null;
-		
-		private Introspector introspector = null;
-		
-		private HttpHeaders headers = null;
-		
-		private String transactionId = null;
-		
-		private UriInfo info = null;
-		
-		private HttpMethod method = null;
-		
-		private URI uri = null;
-				
-		private Optional marshallerProperties = Optional.empty();
-		
-		private Optional rawRequestContent = Optional.empty();
-		/**
-		 * Instantiates a new DB request.
-		 *
-		 * @param method the method
-		 * @param uri the uri
-		 * @param parser the parser
-		 * @param obj the obj
-		 * @param headers the headers
-		 * @param info the info
-		 * @param transactionId the transaction id
-		 */
-		public Builder(HttpMethod method, URI uri, QueryParser parser, Introspector obj, HttpHeaders headers, UriInfo info, String transactionId) {
-			this.method = method;
-			this.parser = parser;
-			this.introspector = obj;
-			this.headers = headers;
-			this.transactionId = transactionId;
-			this.info = info;
-			this.uri = uri;
-			
-		}
-
-		public QueryParser getParser() {
-			return parser;
-		}
-
-		public Introspector getIntrospector() {
-			return introspector;
-		}
-
-		public HttpHeaders getHeaders() {
-			return headers;
-		}
-
-		public String getTransactionId() {
-			return transactionId;
-		}
-
-		public UriInfo getInfo() {
-			return info;
-		}
-
-		public HttpMethod getMethod() {
-			return method;
-		}
-
-		public URI getUri() {
-			return uri;
-		}
-		
-		public Builder customMarshaller(MarshallerProperties properties) {
-			this.marshallerProperties = Optional.of(properties);
-			return this;
-		}
-		
-		public Builder rawRequestContent(String content) {
-			this.rawRequestContent = Optional.of(content);
-			return this;
-		}
-		protected Optional getMarshallerProperties() {
-			return marshallerProperties;
-		}
-		protected Optional getRawRequestContent() {
-			return rawRequestContent;
-		}
-		public DBRequest build() {
-			
-			return new DBRequest(this);
-		}
-		
-		
-	}
+    private final QueryParser parser;
+
+    private final Introspector introspector;
+
+    private final HttpHeaders headers;
+
+    private final String transactionId;
+
+    private final UriInfo info;
+
+    private final HttpMethod method;
+
+    private final URI uri;
+
+    private final Optional rawRequestContent;
+
+    private final Optional marshallerProperties;
+
+    /**
+     * Instantiates a new DB request.
+     *
+     * @param method the method
+     * @param uri the uri
+     * @param parser the parser
+     * @param obj the obj
+     * @param headers the headers
+     * @param info the info
+     * @param transactionId the transaction id
+     */
+    private DBRequest(Builder builder) {
+        this.method = builder.getMethod();
+        this.parser = builder.getParser();
+        this.introspector = builder.getIntrospector();
+        this.headers = builder.getHeaders();
+        this.transactionId = builder.getTransactionId();
+        this.info = builder.getInfo();
+        this.uri = builder.getUri();
+        this.marshallerProperties = builder.getMarshallerProperties();
+        this.rawRequestContent = builder.getRawRequestContent();
+    }
+
+    /**
+     * Gets the headers.
+     *
+     * @return the headers
+     */
+    public HttpHeaders getHeaders() {
+        return headers;
+    }
+
+    /**
+     * Gets the transaction id.
+     *
+     * @return the transaction id
+     */
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    /**
+     * Gets the info.
+     *
+     * @return the info
+     */
+    public UriInfo getInfo() {
+        return info;
+    }
+
+    /**
+     * Gets the parser.
+     *
+     * @return the parser
+     */
+    public QueryParser getParser() {
+        return parser;
+    }
+
+    /**
+     * Gets the introspector.
+     *
+     * @return the introspector
+     */
+    public Introspector getIntrospector() {
+        return introspector;
+    }
+
+    /**
+     * Gets the method.
+     *
+     * @return the method
+     */
+    public HttpMethod getMethod() {
+        return method;
+    }
+
+    /**
+     * Gets the uri.
+     *
+     * @return the uri
+     */
+    public URI getUri() {
+        return uri;
+    }
+
+    /**
+     * Gets the raw content.
+     *
+     * @return the raw content
+     */
+    public Optional getRawRequestContent() {
+        return rawRequestContent;
+    }
+
+    public Optional getMarshallerProperties() {
+        return marshallerProperties;
+    }
+
+    public static class Builder {
+
+        private QueryParser parser = null;
+
+        private Introspector introspector = null;
+
+        private HttpHeaders headers = null;
+
+        private String transactionId = null;
+
+        private UriInfo info = null;
+
+        private HttpMethod method = null;
+
+        private URI uri = null;
+
+        private Optional marshallerProperties = Optional.empty();
+
+        private Optional rawRequestContent = Optional.empty();
+
+        /**
+         * Instantiates a new DB request.
+         *
+         * @param method the method
+         * @param uri the uri
+         * @param parser the parser
+         * @param obj the obj
+         * @param headers the headers
+         * @param info the info
+         * @param transactionId the transaction id
+         */
+        public Builder(HttpMethod method, URI uri, QueryParser parser, Introspector obj, HttpHeaders headers,
+                UriInfo info, String transactionId) {
+            this.method = method;
+            this.parser = parser;
+            this.introspector = obj;
+            this.headers = headers;
+            this.transactionId = transactionId;
+            this.info = info;
+            this.uri = uri;
+
+        }
+
+        public QueryParser getParser() {
+            return parser;
+        }
+
+        public Introspector getIntrospector() {
+            return introspector;
+        }
+
+        public HttpHeaders getHeaders() {
+            return headers;
+        }
+
+        public String getTransactionId() {
+            return transactionId;
+        }
+
+        public UriInfo getInfo() {
+            return info;
+        }
+
+        public HttpMethod getMethod() {
+            return method;
+        }
+
+        public URI getUri() {
+            return uri;
+        }
+
+        public Builder customMarshaller(MarshallerProperties properties) {
+            this.marshallerProperties = Optional.of(properties);
+            return this;
+        }
+
+        public Builder rawRequestContent(String content) {
+            this.rawRequestContent = Optional.of(content);
+            return this;
+        }
+
+        protected Optional getMarshallerProperties() {
+            return marshallerProperties;
+        }
+
+        protected Optional getRawRequestContent() {
+            return rawRequestContent;
+        }
+
+        public DBRequest build() {
+
+            return new DBRequest(this);
+        }
+
+    }
 }
diff --git a/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java b/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java
index 6f551de7..8556c111 100644
--- a/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java
+++ b/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java
@@ -17,8 +17,15 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.rest.db;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.fge.jsonpatch.JsonPatchException;
+import com.github.fge.jsonpatch.mergepatch.JsonMergePatch;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -41,12 +48,6 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriBuilder;
 
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.fge.jsonpatch.JsonPatchException;
-import com.github.fge.jsonpatch.mergepatch.JsonMergePatch;
 import org.apache.commons.lang.StringUtils;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -69,7 +70,6 @@ import org.onap.aai.logging.LoggingContext;
 import org.onap.aai.nodes.NodeIngestor;
 import org.onap.aai.parsers.query.QueryParser;
 import org.onap.aai.parsers.uri.URIToExtensionInformation;
-
 import org.onap.aai.parsers.uri.URIToObject;
 import org.onap.aai.rest.ueb.UEBNotification;
 import org.onap.aai.restcore.HttpMethod;
@@ -93,1127 +93,1169 @@ import org.springframework.beans.factory.annotation.Value;
  */
 public class HttpEntry {
 
-	private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(HttpEntry.class);
-	private static final String TARGET_ENTITY = "DB";
-
-	private ModelType introspectorFactoryType;
-
-	private QueryStyle queryStyle;
-
-	private SchemaVersion version;
-
-	private Loader loader;
-
-	private TransactionalGraphEngine dbEngine;
-
-	private boolean processSingle = true;
-
-	private int paginationBucket = -1;
-	private int paginationIndex = -1;
-	private int totalVertices = 0;
-	private int totalPaginationBuckets = 0;
-
-	@Autowired
-	private NodeIngestor nodeIngestor;
-
-	@Autowired
-	private LoaderFactory loaderFactory;
-
-	@Autowired
-	private SchemaVersions schemaVersions;
-
-	@Value("${schema.uri.base.path}")
-	private String basePath;
-
-	private UEBNotification notification;
-
-	/**
-	 * Instantiates a new http entry.
-	 *
-	 * @param modelType the model type
-	 * @param queryStyle the query style
-	 */
-	public HttpEntry(ModelType modelType, QueryStyle queryStyle) {
-		this.introspectorFactoryType = modelType;
-		this.queryStyle = queryStyle;
-	}
-
-	public HttpEntry setHttpEntryProperties(SchemaVersion version, DBConnectionType connectionType) {
-		this.version = version;
-		this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version);
-		this.dbEngine = new JanusGraphDBEngine(
-			queryStyle,
-			connectionType,
-			loader);
-
-		getDbEngine().startTransaction();
-		this.notification = new UEBNotification(loader, loaderFactory, schemaVersions);
-		return this;
-	}
-
-
-	public HttpEntry setHttpEntryProperties(SchemaVersion version, DBConnectionType connectionType, UEBNotification notification) {
-		this.version = version;
-		this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version);
-		this.dbEngine = new JanusGraphDBEngine(
-			queryStyle,
-			connectionType,
-			loader);
-
-		this.notification = notification;
-		//start transaction on creation
-		getDbEngine().startTransaction();
-		return this;
-	}
-
-
-	/**
-	 * Gets the introspector factory type.
-	 *
-	 * @return the introspector factory type
-	 */
-	public ModelType getIntrospectorFactoryType() {
-		return introspectorFactoryType;
-	}
-
-	/**
-	 * Gets the query style.
-	 *
-	 * @return the query style
-	 */
-	public QueryStyle getQueryStyle() {
-		return queryStyle;
-	}
-
-	/**
-	 * Gets the version.
-	 *
-	 * @return the version
-	 */
-	public SchemaVersion getVersion() {
-		return version;
-	}
-
-	/**
-	 * Gets the loader.
-	 *
-	 * @return the loader
-	 */
-	public Loader getLoader() {
-		return loader;
-	}
-
-	/**
-	 * Gets the db engine.
-	 *
-	 * @return the db engine
-	 */
-	public TransactionalGraphEngine getDbEngine() {
-		return dbEngine;
-	}
-
-	public Pair>> process(List requests, String sourceOfTruth) throws AAIException {
-		return this.process(requests, sourceOfTruth, true);
-	}
-
-
-	/**
-	 * Checks the pagination bucket and pagination index variables to determine whether or not the user
-	 * requested paginated results
-	 *
-	 * @return a boolean true/false of whether the user requested paginated results
-	 */
-	public boolean isPaginated() {
-		return this.paginationBucket > -1 && this.paginationIndex > -1;
-	}
-
-	/**
-	 * Returns the pagination size
-	 * @return integer of the size of results to be returned when paginated
-	 */
-	public int getPaginationBucket() {
-		return this.paginationBucket;
-	}
-
-	/**
-	 * Setter for the pagination bucket variable which stores in this object the size of results to return
-	 * @param pb
-	 */
-	public void setPaginationBucket(int pb) {
-		this.paginationBucket = pb;
-	}
-
-	/**
-	 * Getter to return the pagination index requested by the user when requesting paginated results
-	 * @return
-	 */
-	public int getPaginationIndex() {
-		return this.paginationIndex;
-	}
-
-	/**
-	 * Sets the pagination index that was passed in by the user, to determine which index or results to retrieve when
-	 * paginated
-	 * @param pi
-	 */
-	public void setPaginationIndex(int pi) {
-		if (pi == 0) {
-			pi = 1;
-		}
-		this.paginationIndex = pi;
-	}
-
-	/**
-	 * Sets the total vertices variables and calculates the amount of pages based on size and total vertices
-	 * @param totalVertices
-	 * @param paginationBucketSize
-	 */
-	public void setTotalsForPaging(int totalVertices, int paginationBucketSize) {
-		this.totalVertices = totalVertices;
-		//set total number of buckets equal to full pages
-		this.totalPaginationBuckets = totalVertices / paginationBucketSize;
-		//conditionally add a page for the remainder
-		if (totalVertices % paginationBucketSize > 0) {
-			this.totalPaginationBuckets++;
-		}
-	}
-
-	/**
-	 * @return the total amount of pages
-	 */
-	public int getTotalPaginationBuckets() {
-		return this.totalPaginationBuckets;
-	}
-
-	/**
-	 *
-	 * @return the total number of vertices when paginated
-	 */
-	public int getTotalVertices() {
-		return this.totalVertices;
-	}
-
-	/**
-	 * Process.
-	 * @param requests the requests
-	 * @param sourceOfTruth the source of truth
-	 *
-	 * @return the pair
-	 * @throws AAIException the AAI exception
-	 */
-	public Pair>> process(List requests, String sourceOfTruth, boolean enableResourceVersion) throws AAIException {
-
-		DBSerializer serializer = new DBSerializer(version, dbEngine, introspectorFactoryType, sourceOfTruth);
-		String methodName = "process";
-		Response response;
-		Introspector obj = null;
-		QueryParser query = null;
-		URI uri = null;
-		String transactionId = null;
-		int depth = AAIProperties.MAXIMUM_DEPTH;
-		Format format = null;
-		List> responses = new ArrayList<>();
-		MultivaluedMap params = null;
-		HttpMethod method = null;
-		String uriTemp = "";
-		Boolean success = true;
-		QueryEngine queryEngine = dbEngine.getQueryEngine();
-		int maxRetries = 10;
-		int retry = 0;
-
-		LoggingContext.save();
-		for (DBRequest request : requests) {
-			response = null;
-			Status status = Status.NOT_FOUND;
-			method = request.getMethod();
-			try {
-				for (retry = 0; retry < maxRetries; ++retry) {
-					try {
-
-						LoggingContext.targetEntity(TARGET_ENTITY);
-						LoggingContext.targetServiceName(methodName + " " + method);
-
-						obj = request.getIntrospector();
-						query = request.getParser();
-						transactionId = request.getTransactionId();
-						uriTemp = request.getUri().getRawPath().replaceFirst("^v\\d+/", "");
-						uri = UriBuilder.fromPath(uriTemp).build();
-						LoggingContext.startTime();
-						List vertTemp;
-						List vertices;
-						if (this.isPaginated()) {
-							vertTemp = query.getQueryBuilder().toList();
-							this.setTotalsForPaging(vertTemp.size(), this.paginationBucket);
-							vertices = vertTemp.subList(((this.paginationIndex - 1) * this.paginationBucket), Math.min((this.paginationBucket * this.paginationIndex), vertTemp.size()));
-						} else {
-							vertices = query.getQueryBuilder().toList();
-						}
-						boolean isNewVertex = false;
-						String outputMediaType = getMediaType(request.getHeaders().getAcceptableMediaTypes());
-						String result = null;
-						params = request.getInfo().getQueryParameters(false);
-						depth = setDepth(obj, params.getFirst("depth"));
-						if (params.containsKey("format")) {
-							format = Format.getFormat(params.getFirst("format"));
-						}
-						String cleanUp = params.getFirst("cleanup");
-						String requestContext = "";
-						List requestContextList = request.getHeaders().getRequestHeader("aai-request-context");
-						if (requestContextList != null) {
-							requestContext = requestContextList.get(0);
-						}
-
-						if (cleanUp == null) {
-							cleanUp = "false";
-						}
-						if (vertices.size() > 1 && processSingle && !(method.equals(HttpMethod.GET) || method.equals(HttpMethod.GET_RELATIONSHIP))) {
-							if (method.equals(HttpMethod.DELETE)) {
-								LoggingContext.restoreIfPossible();
-								throw new AAIException("AAI_6138");
-							} else {
-								LoggingContext.restoreIfPossible();
-								throw new AAIException("AAI_6137");
-							}
-						}
-						if (method.equals(HttpMethod.PUT)) {
-							String resourceVersion = (String) obj.getValue("resource-version");
-							if (vertices.isEmpty()) {
-								if (enableResourceVersion) {
-									serializer.verifyResourceVersion("create", query.getResultType(), "", resourceVersion, obj.getURI());
-								}
-								isNewVertex = true;
-							} else {
-								if (enableResourceVersion) {
-									serializer.verifyResourceVersion("update", query.getResultType(), vertices.get(0).property("resource-version").orElse(null), resourceVersion, obj.getURI());
-								}
-								isNewVertex = false;
-							}
-						} else {
-							if (vertices.isEmpty()) {
-								String msg = createNotFoundMessage(query.getResultType(), request.getUri());
-								throw new AAIException("AAI_6114", msg);
-							} else {
-								isNewVertex = false;
-							}
-						}
-						Vertex v = null;
-						if (!isNewVertex) {
-							v = vertices.get(0);
-						}
-						HashMap relatedObjects = new HashMap<>();
-						String nodeOnly = params.getFirst("nodes-only");
-						boolean isNodeOnly = nodeOnly != null;
-						switch (method) {
-							case GET:
-
-								if (format == null) {
-									obj = this.getObjectFromDb(vertices, serializer, query, obj, request.getUri(), depth, isNodeOnly, cleanUp);
-
-
-									LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-									LOGGER.info("Completed");
-									LoggingContext.restoreIfPossible();
-
-									if (obj != null) {
-										status = Status.OK;
-										MarshallerProperties properties;
-										if (!request.getMarshallerProperties().isPresent()) {
-											properties = new MarshallerProperties.Builder(org.onap.aai.restcore.MediaType.getEnum(outputMediaType)).build();
-										} else {
-											properties = request.getMarshallerProperties().get();
-										}
-										result = obj.marshal(properties);
-									}
-								} else {
-									FormatFactory ff = new FormatFactory(loader, serializer, schemaVersions, basePath + "/");
-									Formatter formatter = ff.get(format, params);
-									result = formatter.output(vertices.stream().map(vertex -> (Object) vertex).collect(Collectors.toList())).toString();
-									status = Status.OK;
-								}
-
-								break;
-							case GET_RELATIONSHIP:
-								if (format == null) {
-									obj = this.getRelationshipObjectFromDb(vertices, serializer, query, request.getInfo().getRequestUri());
-
-									LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-									LOGGER.info("Completed");
-									LoggingContext.restoreIfPossible();
-
-									if (obj != null) {
-										status = Status.OK;
-										MarshallerProperties properties;
-										if (!request.getMarshallerProperties().isPresent()) {
-											properties = new MarshallerProperties.Builder(org.onap.aai.restcore.MediaType.getEnum(outputMediaType)).build();
-										} else {
-											properties = request.getMarshallerProperties().get();
-										}
-										result = obj.marshal(properties);
-									} else {
-										String msg = createRelationshipNotFoundMessage(query.getResultType(), request.getUri());
-										throw new AAIException("AAI_6149", msg);
-									}
-								} else {
-									FormatFactory ff = new FormatFactory(loader, serializer, schemaVersions, basePath + "/");
-									Formatter formatter = ff.get(format, params);
-									result = formatter.output(vertices.stream().map(vertex -> (Object) vertex).collect(Collectors.toList())).toString();
-									status = Status.OK;
-								}
-								break;
-							case PUT:
-								response = this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, version, loader, obj, uri, true);
-								if (isNewVertex) {
-									v = serializer.createNewVertex(obj);
-								}
-								serializer.serializeToDb(obj, v, query, uri.getRawPath(), requestContext);
-								this.invokeExtension(dbEngine, this.dbEngine.tx(), HttpMethod.PUT, request, sourceOfTruth, version, loader, obj, uri, false);
-								status = Status.OK;
-								if (isNewVertex) {
-									status = Status.CREATED;
-								}
-								obj = serializer.getLatestVersionView(v);
-								if (query.isDependent()) {
-									relatedObjects = this.getRelatedObjects(serializer, queryEngine, v, obj, this.loader);
-								}
-								LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs() +
-									(long) queryEngine.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-								LOGGER.info("Completed ");
-								LoggingContext.restoreIfPossible();
-								notification.createNotificationEvent(transactionId, sourceOfTruth, status, uri, obj, relatedObjects, basePath);
-
-								break;
-							case PUT_EDGE:
-								serializer.touchStandardVertexProperties(v, false);
-								this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, version, loader, obj, uri, true);
-								serializer.createEdge(obj, v);
-
-								LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-								LOGGER.info("Completed");
-								LoggingContext.restoreIfPossible();
-								status = Status.OK;
-								notification.createNotificationEvent(transactionId, sourceOfTruth, status, new URI(uri.toString().replace("/relationship-list/relationship", "")), serializer.getLatestVersionView(v), relatedObjects, basePath);
-								break;
-							case MERGE_PATCH:
-								Introspector existingObj = loader.introspectorFromName(obj.getDbName());
-								existingObj = this.getObjectFromDb(vertices, serializer, query, existingObj, request.getUri(), 0, false, cleanUp);
-								String existingJson = existingObj.marshal(false);
-								String newJson;
-
-								if (request.getRawRequestContent().isPresent()) {
-									newJson = request.getRawRequestContent().get();
-								} else {
-									newJson = "";
-								}
-								Object relationshipList = request.getIntrospector().getValue("relationship-list");
-								ObjectMapper mapper = new ObjectMapper();
-								try {
-									JsonNode existingNode = mapper.readTree(existingJson);
-									JsonNode newNode = mapper.readTree(newJson);
-									JsonMergePatch patch = JsonMergePatch.fromJson(newNode);
-									JsonNode completed = patch.apply(existingNode);
-									String patched = mapper.writeValueAsString(completed);
-									Introspector patchedObj = loader.unmarshal(existingObj.getName(), patched);
-									if (relationshipList == null) {
-										//if the caller didn't touch the relationship-list, we shouldn't either
-										patchedObj.setValue("relationship-list", null);
-									}
-									serializer.serializeToDb(patchedObj, v, query, uri.getRawPath(), requestContext);
-									status = Status.OK;
-									patchedObj = serializer.getLatestVersionView(v);
-									if (query.isDependent()) {
-										relatedObjects = this.getRelatedObjects(serializer, queryEngine, v, patchedObj, this.loader);
-									}
-									LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs() +
-										(long) queryEngine.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-									LOGGER.info("Completed");
-									LoggingContext.restoreIfPossible();
-									notification.createNotificationEvent(transactionId, sourceOfTruth, status, uri, patchedObj, relatedObjects, basePath);
-								} catch (IOException | JsonPatchException e) {
-
-									LOGGER.info("Caught exception: " + e.getMessage());
-									LoggingContext.restoreIfPossible();
-									throw new AAIException("AAI_3000", "could not perform patch operation");
-								}
-								break;
-							case DELETE:
-								String resourceVersion = params.getFirst("resource-version");
-								obj = serializer.getLatestVersionView(v);
-								if (query.isDependent()) {
-									relatedObjects = this.getRelatedObjects(serializer, queryEngine, v, obj, this.loader);
-								}
-								/*
-								 * Find all Delete-other-vertex vertices and create structure for notify
-								 * findDeleatble also returns the startVertex v and we dont want to create
-								 * duplicate notification events for the same
-								 * So remove the startvertex first
-								 */
-
-								List deletableVertices = dbEngine.getQueryEngine().findDeletable(v);
-								Long vId = (Long) v.id();
-
-								/*
-								 * I am assuming vertexId cant be null
-								 */
-								deletableVertices.removeIf(s -> vId.equals(s.id()));
-								boolean isDelVerticesPresent = !deletableVertices.isEmpty();
-								Map deleteObjects = new HashMap<>();
-								Map uriMap = new HashMap<>();
-								Map> deleteRelatedObjects = new HashMap<>();
-
-								if (isDelVerticesPresent) {
-									deleteObjects = this.buildIntrospectorObjects(serializer, deletableVertices);
-
-									uriMap = this.buildURIMap(serializer, deleteObjects);
-									deleteRelatedObjects = this.buildRelatedObjects(serializer, queryEngine, deleteObjects);
-								}
-
-								this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, version, loader, obj, uri, true);
-								serializer.delete(v, deletableVertices, resourceVersion, enableResourceVersion);
-								this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, version, loader, obj, uri, false);
-
-								LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs() +
-									(long) queryEngine.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-								LOGGER.info("Completed");
-								LoggingContext.restoreIfPossible();
-								status = Status.NO_CONTENT;
-								notification.createNotificationEvent(transactionId, sourceOfTruth, status, uri, obj, relatedObjects, basePath);
-
-								/*
-								 * Notify delete-other-v candidates
-								 */
-
-								if (isDelVerticesPresent) {
-									this.buildNotificationEvent(sourceOfTruth, status, transactionId, notification, deleteObjects,
-										uriMap, deleteRelatedObjects, basePath);
-								}
-
-								break;
-							case DELETE_EDGE:
-								serializer.touchStandardVertexProperties(v, false);
-								serializer.deleteEdge(obj, v);
-
-								LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), TimeUnit.MILLISECONDS);
-								LOGGER.info("Completed");
-								LoggingContext.restoreIfPossible();
-								status = Status.NO_CONTENT;
-								notification.createNotificationEvent(transactionId, sourceOfTruth, Status.OK, new URI(uri.toString().replace("/relationship-list/relationship", "")), serializer.getLatestVersionView(v), relatedObjects, basePath);
-								break;
-							default:
-								break;
-						}
-
-
-						/* temporarily adding vertex id to the headers
-						 * to be able to use for testing the vertex id endpoint functionality
-						 * since we presently have no other way of generating those id urls
-						 */
-						if (response == null && v != null && (
-							method.equals(HttpMethod.PUT)
-								|| method.equals(HttpMethod.GET)
-								|| method.equals(HttpMethod.MERGE_PATCH)
-								|| method.equals(HttpMethod.GET_RELATIONSHIP))
-
-							) {
-							String myvertid = v.id().toString();
-							if (this.isPaginated()) {
-								response = Response.status(status)
-									.header("vertex-id", myvertid)
-									.header("total-results", this.getTotalVertices())
-									.header("total-pages", this.getTotalPaginationBuckets())
-									.entity(result)
-									.type(outputMediaType).build();
-							} else {
-								response = Response.status(status)
-									.header("vertex-id", myvertid)
-									.entity(result)
-									.type(outputMediaType).build();
-							}
-						} else if (response == null) {
-							response = Response.status(status)
-								.type(outputMediaType).build();
-						} else {
-							//response already set to something
-						}
-						Pair pairedResp = Pair.with(request.getUri(), response);
-						responses.add(pairedResp);
-						//break out of retry loop
-						break;
-					} catch (JanusGraphException e) {
-						this.dbEngine.rollback();
-
-						LOGGER.info("Caught exception: " + e.getMessage());
-						LoggingContext.restoreIfPossible();
-						AAIException ex = new AAIException("AAI_6142", e);
-						ErrorLogHelper.logException(ex);
-						Thread.sleep((retry + 1) * 20L);
-						this.dbEngine.startTransaction();
-						queryEngine = dbEngine.getQueryEngine();
-						serializer = new DBSerializer(version, dbEngine, introspectorFactoryType, sourceOfTruth);
-					}
-					if (retry == maxRetries) {
-						throw new AAIException("AAI_6134");
-					}
-				}
-			} catch (AAIException e) {
-				success = false;
-				ArrayList templateVars = new ArrayList<>();
-				templateVars.add(request.getMethod().toString()); //GET, PUT, etc
-				templateVars.add(request.getUri().getPath());
-				templateVars.addAll(e.getTemplateVars());
-				ErrorLogHelper.logException(e);
-				response = Response
-					.status(e.getErrorObject().getHTTPResponseCode())
-					.entity(ErrorLogHelper.getRESTAPIErrorResponse(request.getHeaders().getAcceptableMediaTypes(), e, templateVars))
-					.build();
-				Pair pairedResp = Pair.with(request.getUri(), response);
-				responses.add(pairedResp);
-				continue;
-			} catch (Exception e) {
-				success = false;
-				e.printStackTrace();
-				AAIException ex = new AAIException("AAI_4000", e);
-				ArrayList templateVars = new ArrayList();
-				templateVars.add(request.getMethod().toString()); //GET, PUT, etc
-				templateVars.add(request.getUri().getPath().toString());
-				ErrorLogHelper.logException(ex);
-				response = Response
-					.status(ex.getErrorObject().getHTTPResponseCode())
-					.entity(ErrorLogHelper.getRESTAPIErrorResponse(request.getHeaders().getAcceptableMediaTypes(), ex, templateVars))
-					.build();
-				Pair pairedResp = Pair.with(request.getUri(), response);
-				responses.add(pairedResp);
-				continue;
-			}
-		}
-		notification.triggerEvents();
-		return Pair.with(success, responses);
-	}
-
-
-	/**
-	 * Gets the media type.
-	 *
-	 * @param mediaTypeList the media type list
-	 * @return the media type
-	 */
-	private String getMediaType(List mediaTypeList) {
-		String mediaType = MediaType.APPLICATION_JSON;  // json is the default
-		for (MediaType mt : mediaTypeList) {
-			if (MediaType.APPLICATION_XML_TYPE.isCompatible(mt)) {
-				mediaType = MediaType.APPLICATION_XML;
-			}
-		}
-		return mediaType;
-	}
-
-	/**
-	 * Gets the object from db.
-	 *
-	 * @param serializer the serializer
-	 * @param query the query
-	 * @param obj the obj
-	 * @param uri the uri
-	 * @param depth the depth
-	 * @param cleanUp the clean up
-	 * @return the object from db
-	 * @throws AAIException the AAI exception
-	 * @throws IllegalAccessException the illegal access exception
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws InvocationTargetException the invocation target exception
-	 * @throws SecurityException the security exception
-	 * @throws InstantiationException the instantiation exception
-	 * @throws NoSuchMethodException the no such method exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws MalformedURLException the malformed URL exception
-	 * @throws AAIUnknownObjectException
-	 * @throws URISyntaxException
-	 */
-	private Introspector getObjectFromDb(List results, DBSerializer serializer, QueryParser query, Introspector obj, URI uri, int depth, boolean nodeOnly, String cleanUp) throws AAIException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, UnsupportedEncodingException, AAIUnknownObjectException, URISyntaxException {
-
-		//nothing found
-		if (results.isEmpty()) {
-			String msg = createNotFoundMessage(query.getResultType(), uri);
-			throw new AAIException("AAI_6114", msg);
-		}
-
-		return serializer.dbToObject(results, obj, depth, nodeOnly, cleanUp);
-
-	}
-
-	/**
-	 * Gets the object from db.
-	 *
-	 * @param serializer the serializer
-	 * @param query the query
-	 * @param obj the obj
-	 * @param uri the uri
-	 * @param depth the depth
-	 * @param cleanUp the clean up
-	 * @return the object from db
-	 * @throws AAIException the AAI exception
-	 * @throws IllegalAccessException the illegal access exception
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws InvocationTargetException the invocation target exception
-	 * @throws SecurityException the security exception
-	 * @throws InstantiationException the instantiation exception
-	 * @throws NoSuchMethodException the no such method exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws MalformedURLException the malformed URL exception
-	 * @throws AAIUnknownObjectException
-	 * @throws URISyntaxException
-	 */
-	private Introspector getRelationshipObjectFromDb(List results, DBSerializer serializer, QueryParser query, URI uri) throws AAIException, IllegalArgumentException, SecurityException, UnsupportedEncodingException, AAIUnknownObjectException {
-
-		//nothing found
-		if (results.isEmpty()) {
-			String msg = createNotFoundMessage(query.getResultType(), uri);
-			throw new AAIException("AAI_6114", msg);
-		}
-
-		if (results.size() > 1) {
-			throw new AAIException("AAI_6148", uri.getPath());
-		}
-
-		Vertex v = results.get(0);
-		return serializer.dbToRelationshipObject(v);
-	}
-
-	/**
-	 * Invoke extension.
-	 *
-	 * @param dbEngine the db engine
-	 * @param g the g
-	 * @param httpMethod the http method
-	 * @param fromAppId the from app id
-	 * @param apiVersion the api version
-	 * @param loader the loader
-	 * @param obj the obj
-	 * @param uri the uri
-	 * @param isPreprocess the is preprocess
-	 * @return the response
-	 * @throws IllegalArgumentException the illegal argument exception
-	 * @throws UnsupportedEncodingException the unsupported encoding exception
-	 * @throws AAIException the AAI exception
-	 */
-	private Response invokeExtension(TransactionalGraphEngine dbEngine, Graph g, HttpMethod httpMethod, DBRequest request, String fromAppId, SchemaVersion apiVersion, Loader loader, Introspector obj, URI uri, boolean isPreprocess) throws IllegalArgumentException, UnsupportedEncodingException, AAIException {
-		AAIExtensionMap aaiExtMap = new AAIExtensionMap();
-		//ModelInjestor injestor = ModelInjestor.getInstance();
-		Response response = null;
-		URIToExtensionInformation extensionInformation = new URIToExtensionInformation(loader, uri);
-		aaiExtMap.setHttpEntry(this);
-		aaiExtMap.setDbRequest(request);
-		aaiExtMap.setTransId(request.getTransactionId());
-		aaiExtMap.setFromAppId(fromAppId);
-		aaiExtMap.setGraph(g);
-		aaiExtMap.setApiVersion(apiVersion.toString());
-		aaiExtMap.setObjectFromRequest(obj);
-		aaiExtMap.setObjectFromRequestType(obj.getJavaClassName());
-		aaiExtMap.setObjectFromResponse(obj);
-		aaiExtMap.setObjectFromResponseType(obj.getJavaClassName());
-		aaiExtMap.setJaxbContext(nodeIngestor.getContextForVersion(apiVersion));
-		aaiExtMap.setUri(uri.getRawPath());
-		aaiExtMap.setTransactionalGraphEngine(dbEngine);
-		aaiExtMap.setLoader(loader);
-		aaiExtMap.setNamespace(extensionInformation.getNamespace());
-
-		ExtensionController ext = new ExtensionController();
-		ext.runExtension(aaiExtMap.getApiVersion(),
-			extensionInformation.getNamespace(),
-			extensionInformation.getTopObject(),
-			extensionInformation.getMethodName(httpMethod, isPreprocess),
-			aaiExtMap,
-			isPreprocess);
-
-		if (aaiExtMap.getPrecheckAddedList().size() > 0) {
-			response = notifyOnSkeletonCreation(aaiExtMap, obj, request.getHeaders());
-		}
-
-		return response;
-	}
-
-	/**
-	 * Notify on skeleton creation.
-	 *
-	 * @param aaiExtMap the aai ext map
-	 * @param input the input
-	 * @param headers the headers
-	 * @return the response
-	 */
-	//Legacy support
-	private Response notifyOnSkeletonCreation(AAIExtensionMap aaiExtMap, Introspector input, HttpHeaders headers) {
-		Response response = null;
-		HashMap> exceptionList = new HashMap>();
-
-		StringBuilder keyString = new StringBuilder();
-
-		Set resourceKeys = input.getKeys();
-		for (String key : resourceKeys) {
-			keyString.append(key).append("=").append(input.getValue(key).toString()).append(" ");
-		}
-
-		for (AAIResponseMessage msg : aaiExtMap.getPrecheckResponseMessages().getAAIResponseMessage()) {
-			ArrayList templateVars = new ArrayList<>();
-
-			templateVars.add("PUT " + input.getDbName());
-			templateVars.add(keyString.toString());
-			List keys = new ArrayList<>();
-			templateVars.add(msg.getAaiResponseMessageResourceType());
-			for (AAIResponseMessageDatum dat : msg.getAaiResponseMessageData().getAAIResponseMessageDatum()) {
-				keys.add(dat.getAaiResponseMessageDatumKey() + "=" + dat.getAaiResponseMessageDatumValue());
-			}
-			templateVars.add(StringUtils.join(keys, ", "));
-			exceptionList.put(new AAIException("AAI_0004", msg.getAaiResponseMessageResourceType()),
-				templateVars);
-		}
-		response = Response
-			.status(Status.ACCEPTED).entity(ErrorLogHelper
-				.getRESTAPIInfoResponse(headers.getAcceptableMediaTypes(), exceptionList))
-			.build();
-
-		return response;
-	}
-
-	/**
-	 * Creates the not found message.
-	 *
-	 * @param resultType the result type
-	 * @param uri the uri
-	 * @return the string
-	 */
-	private String createNotFoundMessage(String resultType, URI uri) {
-
-		String msg = "No Node of type " + resultType + " found at: " + uri.getPath();
-
-		return msg;
-	}
-
-	/**
-	 * Creates the not found message.
-	 *
-	 * @param resultType the result type
-	 * @param uri the uri
-	 * @return the string
-	 */
-	private String createRelationshipNotFoundMessage(String resultType, URI uri) {
-
-		String msg = "No relationship found of type " + resultType + " at the given URI: " + uri.getPath() + "/relationship-list";
-
-		return msg;
-	}
-
-	/**
-	 * Sets the depth.
-	 *
-	 * @param depthParam the depth param
-	 * @return the int
-	 * @throws AAIException the AAI exception
-	 */
-	protected int setDepth(Introspector obj, String depthParam) throws AAIException {
-		int depth = AAIProperties.MAXIMUM_DEPTH;
-
-		String getAllRandomStr = AAIConfig.get("aai.rest.getall.depthparam", "");
-		if (depthParam != null && getAllRandomStr != null && !getAllRandomStr.isEmpty()
-			&& getAllRandomStr.equals(depthParam)) {
-			return depth;
-		}
-
-		if (depthParam == null) {
-			if (this.version.compareTo(schemaVersions.getDepthVersion()) >= 0) {
-				depth = 0;
-			} else {
-				depth = AAIProperties.MAXIMUM_DEPTH;
-			}
-		} else {
-			if (!depthParam.isEmpty() && !"all".equals(depthParam)) {
-				try {
-					depth = Integer.parseInt(depthParam);
-				} catch (Exception e) {
-					throw new AAIException("AAI_4016");
-				}
-
-			}
-		}
-		String maxDepth = obj.getMetadata(ObjectMetadata.MAXIMUM_DEPTH);
-
-		int maximumDepth = AAIProperties.MAXIMUM_DEPTH;
-
-		if (maxDepth != null) {
-			try {
-				maximumDepth = Integer.parseInt(maxDepth);
-			} catch (Exception ex) {
-				throw new AAIException("AAI_4018");
-			}
-		}
-
-		if (depth > maximumDepth) {
-			throw new AAIException("AAI_3303");
-		}
-
-		return depth;
-	}
-
-	/**
-	 * Checks if is modification method.
-	 *
-	 * @param method the method
-	 * @return true, if is modification method
-	 */
-	private boolean isModificationMethod(HttpMethod method) {
-		boolean result = false;
-
-		if (method.equals(HttpMethod.PUT) || method.equals(HttpMethod.PUT_EDGE) || method.equals(HttpMethod.DELETE_EDGE) || method.equals(HttpMethod.MERGE_PATCH)) {
-			result = true;
-		}
-
-		return result;
-
-	}
-
-	/**
-	 * Given an uri, introspector object and loader object
-	 * it will check if the obj is top level object if it is,
-	 * it will return immediately returning the uri passed in
-	 * If it isn't, it will go through, get the uriTemplate
-	 * from the introspector object and get the count of "/"s
-	 * and remove that part of the uri using substring
-	 * and keep doing that until the current object is top level
-	 * Also added the max depth just so worst case scenario
-	 * Then keep adding aai-uri to the list include the aai-uri passed in
-	 * Convert that list into an array and return it
-	 * 

- * - * Example: - * - *

- * aai-uri -> /cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant1/vservers/vserver/v1 - * - * Given the uriTemplate vserver -> /vservers/vserver/{vserver-id} - * it converts to /vservers/vserver - * - * lastIndexOf /vservers/vserver in /cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant1/vservers/vserver/v1 - * ^ - * | - * | - * lastIndexOf - * Use substring to get the string from 0 to that lastIndexOf - * aai-uri -> /cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant1 - * - * From this new aai-uri, generate a introspector from the URITOObject class - * and keep doing this until you - * - *
- * - * @param aaiUri - aai-uri of the vertex representating the unique id of a given vertex - * @param obj - introspector object of the given starting vertex - * @param loader - Type of loader which will always be MoxyLoader to support model driven - * @return an array of strings which can be used to get the vertexes of parent and grand parents from a given vertex - * @throws UnsupportedEncodingException - * @throws AAIException - */ - String[] convertIntrospectorToUriList(String aaiUri, Introspector obj, Loader loader) throws UnsupportedEncodingException, AAIException { - - List uriList = new ArrayList<>(); - String template = StringUtils.EMPTY; - String truncatedUri = aaiUri; - int depth = AAIProperties.MAXIMUM_DEPTH; - uriList.add(truncatedUri); - - while (depth >= 0 && !obj.isTopLevel()) { - template = obj.getMetadata(ObjectMetadata.URI_TEMPLATE); - - if (template == null) { - LOGGER.warn("Unable to find the uriTemplate for the object {}", obj.getDbName()); - return null; - } - - int templateCount = StringUtils.countMatches(template, "/"); - int truncatedUriCount = StringUtils.countMatches(truncatedUri, "/"); - - if (templateCount > truncatedUriCount) { - LOGGER.warn("Template uri {} contains more slashes than truncatedUri {}", template, truncatedUri); - return null; - } - - int cutIndex = StringUtils.ordinalIndexOf(truncatedUri, "/", truncatedUriCount - templateCount + 1); - truncatedUri = StringUtils.substring(truncatedUri, 0, cutIndex); - uriList.add(truncatedUri); - obj = new URIToObject(loader, UriBuilder.fromPath(truncatedUri).build()).getEntity(); - depth--; - } - - return uriList.toArray(new String[uriList.size()]); - } - - /** - * - * @param serializer - * @param queryEngine - * @param v - * @param obj - * @param loader - * @return - * @throws IllegalAccessException - * @throws IllegalArgumentException - * @throws InvocationTargetException - * @throws SecurityException - * @throws InstantiationException - * @throws NoSuchMethodException - * @throws UnsupportedEncodingException - * @throws AAIException - * @throws URISyntaxException - */ - private HashMap getRelatedObjects(DBSerializer serializer, QueryEngine queryEngine, Vertex v, Introspector obj, Loader loader) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, UnsupportedEncodingException, AAIException, URISyntaxException { - - HashMap relatedVertices = new HashMap<>(); - VertexProperty aaiUriProperty = v.property(AAIProperties.AAI_URI); - - if (!aaiUriProperty.isPresent()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("For the given vertex {}, it seems aai-uri is not present so not getting related objects", v.id().toString()); - } else { - LOGGER.info("It seems aai-uri is not present in vertex, so not getting related objects, for more info enable debug log"); - } - return relatedVertices; - } - - String aaiUri = aaiUriProperty.value().toString(); - - if (!obj.isTopLevel()) { - String[] uriList = convertIntrospectorToUriList(aaiUri, obj, loader); - List vertexChain = null; - // If the uriList is null then there is something wrong with converting the uri - // into a list of aai-uris so falling back to the old mechanism for finding parents - if (uriList == null) { - LOGGER.info("Falling back to the old mechanism due to unable to convert aai-uri to list of uris but this is not optimal"); - vertexChain = queryEngine.findParents(v); - } else { - vertexChain = queryEngine.findParents(uriList); - } - for (Vertex vertex : vertexChain) { - try { - final Introspector vertexObj = serializer.getVertexProperties(vertex); - relatedVertices.put(vertexObj.getObjectId(), vertexObj); - } catch (AAIUnknownObjectException e) { - LOGGER.warn("Unable to get vertex properties, partial list of related vertices returned"); - } - } - } else { - try { - final Introspector vertexObj = serializer.getVertexProperties(v); - relatedVertices.put(vertexObj.getObjectId(), vertexObj); - } catch (AAIUnknownObjectException e) { - LOGGER.warn("Unable to get vertex properties, partial list of related vertices returned"); - } - } - - return relatedVertices; - } - - private Map buildIntrospectorObjects(DBSerializer serializer, Iterable vertices) { - Map deleteObjectMap = new HashMap<>(); - for (Vertex vertex : vertices) { - try { - // deleteObjectMap.computeIfAbsent(vertex, s -> - // serializer.getLatestVersionView(vertex)); - Introspector deleteObj = serializer.getLatestVersionView(vertex); - deleteObjectMap.put(vertex, deleteObj); - } catch (UnsupportedEncodingException | AAIException e) { - LOGGER.warn("Unable to get Introspctor Objects, Just continue"); - continue; - } - - } - - return deleteObjectMap; - - } - - private Map buildURIMap(DBSerializer serializer, Map introSpector) { - Map uriMap = new HashMap<>(); - for (Map.Entry entry : introSpector.entrySet()) { - URI uri; - try { - uri = serializer.getURIForVertex(entry.getKey()); - if (null != entry.getValue()) { - uriMap.put(entry.getValue().getObjectId(), uri); - } - } catch (UnsupportedEncodingException e) { - LOGGER.warn("Unable to get URIs, Just continue"); - continue; - } - - } - - return uriMap; - - } - - private Map> buildRelatedObjects(DBSerializer serializer, - QueryEngine queryEngine, Map introSpector) { - - Map> relatedObjectsMap = new HashMap<>(); - for (Map.Entry entry : introSpector.entrySet()) { - try { - HashMap relatedObjects = this.getRelatedObjects(serializer, queryEngine, - entry.getKey(), entry.getValue(), this.loader); - if (null != entry.getValue()) { - relatedObjectsMap.put(entry.getValue().getObjectId(), relatedObjects); - } - } catch (IllegalAccessException | IllegalArgumentException - | InvocationTargetException | SecurityException | InstantiationException | NoSuchMethodException - | UnsupportedEncodingException | AAIException | URISyntaxException e) { - LOGGER.warn("Unable to get realted Objects, Just continue"); - continue; - } - - } - - return relatedObjectsMap; - - } - - private void buildNotificationEvent(String sourceOfTruth, Status status, String transactionId, - UEBNotification notification, Map deleteObjects, Map uriMap, - Map> deleteRelatedObjects, String basePath) { - for (Map.Entry entry : deleteObjects.entrySet()) { - try { - String vertexObjectId = ""; - - if (null != entry.getValue()) { - vertexObjectId = entry.getValue().getObjectId(); - - if (uriMap.containsKey(vertexObjectId) && deleteRelatedObjects.containsKey(vertexObjectId)) { - notification.createNotificationEvent(transactionId, sourceOfTruth, status, - uriMap.get(vertexObjectId), entry.getValue(), deleteRelatedObjects.get(vertexObjectId), basePath); - } - } - } catch (UnsupportedEncodingException | AAIException e) { - - LOGGER.warn("Error in sending notification"); - } - } - } - - public void setPaginationParameters(String resultIndex, String resultSize) { - if (resultIndex != null && resultIndex != "-1" && resultSize != null && resultSize != "-1") { - this.setPaginationIndex(Integer.parseInt(resultIndex)); - this.setPaginationBucket(Integer.parseInt(resultSize)); - } - } - - public List getPaginatedVertexList(List vertexList) throws AAIException { - List vertices; - if (this.isPaginated()) { - this.setTotalsForPaging(vertexList.size(), this.getPaginationBucket()); - int startIndex = (this.getPaginationIndex() - 1) * this.getPaginationBucket(); - int endIndex = Math.min((this.getPaginationBucket() * this.getPaginationIndex()), vertexList.size()); - if (startIndex > endIndex) { - throw new AAIException("AAI_6150", " ResultIndex is not appropriate for the result set, Needs to be <= " + endIndex); - } - vertices = vertexList.subList(startIndex, endIndex); - } else { - vertices = vertexList; - } - return vertices; - } + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(HttpEntry.class); + private static final String TARGET_ENTITY = "DB"; + + private ModelType introspectorFactoryType; + + private QueryStyle queryStyle; + + private SchemaVersion version; + + private Loader loader; + + private TransactionalGraphEngine dbEngine; + + private boolean processSingle = true; + + private int paginationBucket = -1; + private int paginationIndex = -1; + private int totalVertices = 0; + private int totalPaginationBuckets = 0; + + @Autowired + private NodeIngestor nodeIngestor; + + @Autowired + private LoaderFactory loaderFactory; + + @Autowired + private SchemaVersions schemaVersions; + + @Value("${schema.uri.base.path}") + private String basePath; + + private UEBNotification notification; + + /** + * Instantiates a new http entry. + * + * @param modelType the model type + * @param queryStyle the query style + */ + public HttpEntry(ModelType modelType, QueryStyle queryStyle) { + this.introspectorFactoryType = modelType; + this.queryStyle = queryStyle; + } + + public HttpEntry setHttpEntryProperties(SchemaVersion version, DBConnectionType connectionType) { + this.version = version; + this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version); + this.dbEngine = new JanusGraphDBEngine(queryStyle, connectionType, loader); + + getDbEngine().startTransaction(); + this.notification = new UEBNotification(loader, loaderFactory, schemaVersions); + return this; + } + + public HttpEntry setHttpEntryProperties(SchemaVersion version, DBConnectionType connectionType, + UEBNotification notification) { + this.version = version; + this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version); + this.dbEngine = new JanusGraphDBEngine(queryStyle, connectionType, loader); + + this.notification = notification; + // start transaction on creation + getDbEngine().startTransaction(); + return this; + } + + /** + * Gets the introspector factory type. + * + * @return the introspector factory type + */ + public ModelType getIntrospectorFactoryType() { + return introspectorFactoryType; + } + + /** + * Gets the query style. + * + * @return the query style + */ + public QueryStyle getQueryStyle() { + return queryStyle; + } + + /** + * Gets the version. + * + * @return the version + */ + public SchemaVersion getVersion() { + return version; + } + + /** + * Gets the loader. + * + * @return the loader + */ + public Loader getLoader() { + return loader; + } + + /** + * Gets the db engine. + * + * @return the db engine + */ + public TransactionalGraphEngine getDbEngine() { + return dbEngine; + } + + public Pair>> process(List requests, String sourceOfTruth) + throws AAIException { + return this.process(requests, sourceOfTruth, true); + } + + /** + * Checks the pagination bucket and pagination index variables to determine whether or not the user + * requested paginated results + * + * @return a boolean true/false of whether the user requested paginated results + */ + public boolean isPaginated() { + return this.paginationBucket > -1 && this.paginationIndex > -1; + } + + /** + * Returns the pagination size + * + * @return integer of the size of results to be returned when paginated + */ + public int getPaginationBucket() { + return this.paginationBucket; + } + + /** + * Setter for the pagination bucket variable which stores in this object the size of results to return + * + * @param pb + */ + public void setPaginationBucket(int pb) { + this.paginationBucket = pb; + } + + /** + * Getter to return the pagination index requested by the user when requesting paginated results + * + * @return + */ + public int getPaginationIndex() { + return this.paginationIndex; + } + + /** + * Sets the pagination index that was passed in by the user, to determine which index or results to retrieve when + * paginated + * + * @param pi + */ + public void setPaginationIndex(int pi) { + if (pi == 0) { + pi = 1; + } + this.paginationIndex = pi; + } + + /** + * Sets the total vertices variables and calculates the amount of pages based on size and total vertices + * + * @param totalVertices + * @param paginationBucketSize + */ + public void setTotalsForPaging(int totalVertices, int paginationBucketSize) { + this.totalVertices = totalVertices; + // set total number of buckets equal to full pages + this.totalPaginationBuckets = totalVertices / paginationBucketSize; + // conditionally add a page for the remainder + if (totalVertices % paginationBucketSize > 0) { + this.totalPaginationBuckets++; + } + } + + /** + * @return the total amount of pages + */ + public int getTotalPaginationBuckets() { + return this.totalPaginationBuckets; + } + + /** + * + * @return the total number of vertices when paginated + */ + public int getTotalVertices() { + return this.totalVertices; + } + + /** + * Process. + * + * @param requests the requests + * @param sourceOfTruth the source of truth + * + * @return the pair + * @throws AAIException the AAI exception + */ + public Pair>> process(List requests, String sourceOfTruth, + boolean enableResourceVersion) throws AAIException { + + DBSerializer serializer = new DBSerializer(version, dbEngine, introspectorFactoryType, sourceOfTruth); + String methodName = "process"; + Response response; + Introspector obj = null; + QueryParser query = null; + URI uri = null; + String transactionId = null; + int depth = AAIProperties.MAXIMUM_DEPTH; + Format format = null; + List> responses = new ArrayList<>(); + MultivaluedMap params = null; + HttpMethod method = null; + String uriTemp = ""; + Boolean success = true; + QueryEngine queryEngine = dbEngine.getQueryEngine(); + int maxRetries = 10; + int retry = 0; + + LoggingContext.save(); + for (DBRequest request : requests) { + response = null; + Status status = Status.NOT_FOUND; + method = request.getMethod(); + try { + for (retry = 0; retry < maxRetries; ++retry) { + try { + + LoggingContext.targetEntity(TARGET_ENTITY); + LoggingContext.targetServiceName(methodName + " " + method); + + obj = request.getIntrospector(); + query = request.getParser(); + transactionId = request.getTransactionId(); + uriTemp = request.getUri().getRawPath().replaceFirst("^v\\d+/", ""); + uri = UriBuilder.fromPath(uriTemp).build(); + LoggingContext.startTime(); + List vertTemp; + List vertices; + if (this.isPaginated()) { + vertTemp = query.getQueryBuilder().toList(); + this.setTotalsForPaging(vertTemp.size(), this.paginationBucket); + vertices = vertTemp.subList(((this.paginationIndex - 1) * this.paginationBucket), + Math.min((this.paginationBucket * this.paginationIndex), vertTemp.size())); + } else { + vertices = query.getQueryBuilder().toList(); + } + boolean isNewVertex = false; + String outputMediaType = getMediaType(request.getHeaders().getAcceptableMediaTypes()); + String result = null; + params = request.getInfo().getQueryParameters(false); + depth = setDepth(obj, params.getFirst("depth")); + if (params.containsKey("format")) { + format = Format.getFormat(params.getFirst("format")); + } + String cleanUp = params.getFirst("cleanup"); + String requestContext = ""; + List requestContextList = request.getHeaders().getRequestHeader("aai-request-context"); + if (requestContextList != null) { + requestContext = requestContextList.get(0); + } + + if (cleanUp == null) { + cleanUp = "false"; + } + if (vertices.size() > 1 && processSingle + && !(method.equals(HttpMethod.GET) || method.equals(HttpMethod.GET_RELATIONSHIP))) { + if (method.equals(HttpMethod.DELETE)) { + LoggingContext.restoreIfPossible(); + throw new AAIException("AAI_6138"); + } else { + LoggingContext.restoreIfPossible(); + throw new AAIException("AAI_6137"); + } + } + if (method.equals(HttpMethod.PUT)) { + String resourceVersion = (String) obj.getValue("resource-version"); + if (vertices.isEmpty()) { + if (enableResourceVersion) { + serializer.verifyResourceVersion("create", query.getResultType(), "", + resourceVersion, obj.getURI()); + } + isNewVertex = true; + } else { + if (enableResourceVersion) { + serializer.verifyResourceVersion("update", query.getResultType(), + vertices.get(0).property("resource-version").orElse(null), + resourceVersion, obj.getURI()); + } + isNewVertex = false; + } + } else { + if (vertices.isEmpty()) { + String msg = createNotFoundMessage(query.getResultType(), request.getUri()); + throw new AAIException("AAI_6114", msg); + } else { + isNewVertex = false; + } + } + Vertex v = null; + if (!isNewVertex) { + v = vertices.get(0); + } + HashMap relatedObjects = new HashMap<>(); + String nodeOnly = params.getFirst("nodes-only"); + boolean isNodeOnly = nodeOnly != null; + switch (method) { + case GET: + + if (format == null) { + obj = this.getObjectFromDb(vertices, serializer, query, obj, request.getUri(), + depth, isNodeOnly, cleanUp); + + LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), + TimeUnit.MILLISECONDS); + LOGGER.info("Completed"); + LoggingContext.restoreIfPossible(); + + if (obj != null) { + status = Status.OK; + MarshallerProperties properties; + if (!request.getMarshallerProperties().isPresent()) { + properties = new MarshallerProperties.Builder( + org.onap.aai.restcore.MediaType.getEnum(outputMediaType)).build(); + } else { + properties = request.getMarshallerProperties().get(); + } + result = obj.marshal(properties); + } + } else { + FormatFactory ff = + new FormatFactory(loader, serializer, schemaVersions, basePath + "/"); + Formatter formatter = ff.get(format, params); + result = formatter.output(vertices.stream().map(vertex -> (Object) vertex) + .collect(Collectors.toList())).toString(); + status = Status.OK; + } + + break; + case GET_RELATIONSHIP: + if (format == null) { + obj = this.getRelationshipObjectFromDb(vertices, serializer, query, + request.getInfo().getRequestUri()); + + LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), + TimeUnit.MILLISECONDS); + LOGGER.info("Completed"); + LoggingContext.restoreIfPossible(); + + if (obj != null) { + status = Status.OK; + MarshallerProperties properties; + if (!request.getMarshallerProperties().isPresent()) { + properties = new MarshallerProperties.Builder( + org.onap.aai.restcore.MediaType.getEnum(outputMediaType)).build(); + } else { + properties = request.getMarshallerProperties().get(); + } + result = obj.marshal(properties); + } else { + String msg = createRelationshipNotFoundMessage(query.getResultType(), + request.getUri()); + throw new AAIException("AAI_6149", msg); + } + } else { + FormatFactory ff = + new FormatFactory(loader, serializer, schemaVersions, basePath + "/"); + Formatter formatter = ff.get(format, params); + result = formatter.output(vertices.stream().map(vertex -> (Object) vertex) + .collect(Collectors.toList())).toString(); + status = Status.OK; + } + break; + case PUT: + response = this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, + sourceOfTruth, version, loader, obj, uri, true); + if (isNewVertex) { + v = serializer.createNewVertex(obj); + } + serializer.serializeToDb(obj, v, query, uri.getRawPath(), requestContext); + this.invokeExtension(dbEngine, this.dbEngine.tx(), HttpMethod.PUT, request, + sourceOfTruth, version, loader, obj, uri, false); + status = Status.OK; + if (isNewVertex) { + status = Status.CREATED; + } + obj = serializer.getLatestVersionView(v); + if (query.isDependent()) { + relatedObjects = + this.getRelatedObjects(serializer, queryEngine, v, obj, this.loader); + } + LoggingContext.elapsedTime( + (long) serializer.getDBTimeMsecs() + (long) queryEngine.getDBTimeMsecs(), + TimeUnit.MILLISECONDS); + LOGGER.info("Completed "); + LoggingContext.restoreIfPossible(); + notification.createNotificationEvent(transactionId, sourceOfTruth, status, uri, obj, + relatedObjects, basePath); + + break; + case PUT_EDGE: + serializer.touchStandardVertexProperties(v, false); + this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, + version, loader, obj, uri, true); + serializer.createEdge(obj, v); + + LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), TimeUnit.MILLISECONDS); + LOGGER.info("Completed"); + LoggingContext.restoreIfPossible(); + status = Status.OK; + notification.createNotificationEvent(transactionId, sourceOfTruth, status, + new URI(uri.toString().replace("/relationship-list/relationship", "")), + serializer.getLatestVersionView(v), relatedObjects, basePath); + break; + case MERGE_PATCH: + Introspector existingObj = loader.introspectorFromName(obj.getDbName()); + existingObj = this.getObjectFromDb(vertices, serializer, query, existingObj, + request.getUri(), 0, false, cleanUp); + String existingJson = existingObj.marshal(false); + String newJson; + + if (request.getRawRequestContent().isPresent()) { + newJson = request.getRawRequestContent().get(); + } else { + newJson = ""; + } + Object relationshipList = request.getIntrospector().getValue("relationship-list"); + ObjectMapper mapper = new ObjectMapper(); + try { + JsonNode existingNode = mapper.readTree(existingJson); + JsonNode newNode = mapper.readTree(newJson); + JsonMergePatch patch = JsonMergePatch.fromJson(newNode); + JsonNode completed = patch.apply(existingNode); + String patched = mapper.writeValueAsString(completed); + Introspector patchedObj = loader.unmarshal(existingObj.getName(), patched); + if (relationshipList == null) { + // if the caller didn't touch the relationship-list, we shouldn't either + patchedObj.setValue("relationship-list", null); + } + serializer.serializeToDb(patchedObj, v, query, uri.getRawPath(), requestContext); + status = Status.OK; + patchedObj = serializer.getLatestVersionView(v); + if (query.isDependent()) { + relatedObjects = this.getRelatedObjects(serializer, queryEngine, v, patchedObj, + this.loader); + } + LoggingContext.elapsedTime( + (long) serializer.getDBTimeMsecs() + (long) queryEngine.getDBTimeMsecs(), + TimeUnit.MILLISECONDS); + LOGGER.info("Completed"); + LoggingContext.restoreIfPossible(); + notification.createNotificationEvent(transactionId, sourceOfTruth, status, uri, + patchedObj, relatedObjects, basePath); + } catch (IOException | JsonPatchException e) { + + LOGGER.info("Caught exception: " + e.getMessage()); + LoggingContext.restoreIfPossible(); + throw new AAIException("AAI_3000", "could not perform patch operation"); + } + break; + case DELETE: + String resourceVersion = params.getFirst("resource-version"); + obj = serializer.getLatestVersionView(v); + if (query.isDependent()) { + relatedObjects = + this.getRelatedObjects(serializer, queryEngine, v, obj, this.loader); + } + /* + * Find all Delete-other-vertex vertices and create structure for notify + * findDeleatble also returns the startVertex v and we dont want to create + * duplicate notification events for the same + * So remove the startvertex first + */ + + List deletableVertices = dbEngine.getQueryEngine().findDeletable(v); + Long vId = (Long) v.id(); + + /* + * I am assuming vertexId cant be null + */ + deletableVertices.removeIf(s -> vId.equals(s.id())); + boolean isDelVerticesPresent = !deletableVertices.isEmpty(); + Map deleteObjects = new HashMap<>(); + Map uriMap = new HashMap<>(); + Map> deleteRelatedObjects = new HashMap<>(); + + if (isDelVerticesPresent) { + deleteObjects = this.buildIntrospectorObjects(serializer, deletableVertices); + + uriMap = this.buildURIMap(serializer, deleteObjects); + deleteRelatedObjects = + this.buildRelatedObjects(serializer, queryEngine, deleteObjects); + } + + this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, + version, loader, obj, uri, true); + serializer.delete(v, deletableVertices, resourceVersion, enableResourceVersion); + this.invokeExtension(dbEngine, this.dbEngine.tx(), method, request, sourceOfTruth, + version, loader, obj, uri, false); + + LoggingContext.elapsedTime( + (long) serializer.getDBTimeMsecs() + (long) queryEngine.getDBTimeMsecs(), + TimeUnit.MILLISECONDS); + LOGGER.info("Completed"); + LoggingContext.restoreIfPossible(); + status = Status.NO_CONTENT; + notification.createNotificationEvent(transactionId, sourceOfTruth, status, uri, obj, + relatedObjects, basePath); + + /* + * Notify delete-other-v candidates + */ + + if (isDelVerticesPresent) { + this.buildNotificationEvent(sourceOfTruth, status, transactionId, notification, + deleteObjects, uriMap, deleteRelatedObjects, basePath); + } + + break; + case DELETE_EDGE: + serializer.touchStandardVertexProperties(v, false); + serializer.deleteEdge(obj, v); + + LoggingContext.elapsedTime((long) serializer.getDBTimeMsecs(), TimeUnit.MILLISECONDS); + LOGGER.info("Completed"); + LoggingContext.restoreIfPossible(); + status = Status.NO_CONTENT; + notification.createNotificationEvent(transactionId, sourceOfTruth, Status.OK, + new URI(uri.toString().replace("/relationship-list/relationship", "")), + serializer.getLatestVersionView(v), relatedObjects, basePath); + break; + default: + break; + } + + /* + * temporarily adding vertex id to the headers + * to be able to use for testing the vertex id endpoint functionality + * since we presently have no other way of generating those id urls + */ + if (response == null && v != null + && (method.equals(HttpMethod.PUT) || method.equals(HttpMethod.GET) + || method.equals(HttpMethod.MERGE_PATCH) + || method.equals(HttpMethod.GET_RELATIONSHIP)) + + ) { + String myvertid = v.id().toString(); + if (this.isPaginated()) { + response = Response.status(status).header("vertex-id", myvertid) + .header("total-results", this.getTotalVertices()) + .header("total-pages", this.getTotalPaginationBuckets()).entity(result) + .type(outputMediaType).build(); + } else { + response = Response.status(status).header("vertex-id", myvertid).entity(result) + .type(outputMediaType).build(); + } + } else if (response == null) { + response = Response.status(status).type(outputMediaType).build(); + } else { + // response already set to something + } + Pair pairedResp = Pair.with(request.getUri(), response); + responses.add(pairedResp); + // break out of retry loop + break; + } catch (JanusGraphException e) { + this.dbEngine.rollback(); + + LOGGER.info("Caught exception: " + e.getMessage()); + LoggingContext.restoreIfPossible(); + AAIException ex = new AAIException("AAI_6142", e); + ErrorLogHelper.logException(ex); + Thread.sleep((retry + 1) * 20L); + this.dbEngine.startTransaction(); + queryEngine = dbEngine.getQueryEngine(); + serializer = new DBSerializer(version, dbEngine, introspectorFactoryType, sourceOfTruth); + } + if (retry == maxRetries) { + throw new AAIException("AAI_6134"); + } + } + } catch (AAIException e) { + success = false; + ArrayList templateVars = new ArrayList<>(); + templateVars.add(request.getMethod().toString()); // GET, PUT, etc + templateVars.add(request.getUri().getPath()); + templateVars.addAll(e.getTemplateVars()); + ErrorLogHelper.logException(e); + response = Response.status(e.getErrorObject().getHTTPResponseCode()).entity(ErrorLogHelper + .getRESTAPIErrorResponse(request.getHeaders().getAcceptableMediaTypes(), e, templateVars)) + .build(); + Pair pairedResp = Pair.with(request.getUri(), response); + responses.add(pairedResp); + continue; + } catch (Exception e) { + success = false; + e.printStackTrace(); + AAIException ex = new AAIException("AAI_4000", e); + ArrayList templateVars = new ArrayList(); + templateVars.add(request.getMethod().toString()); // GET, PUT, etc + templateVars.add(request.getUri().getPath().toString()); + ErrorLogHelper.logException(ex); + response = Response.status(ex.getErrorObject().getHTTPResponseCode()).entity(ErrorLogHelper + .getRESTAPIErrorResponse(request.getHeaders().getAcceptableMediaTypes(), ex, templateVars)) + .build(); + Pair pairedResp = Pair.with(request.getUri(), response); + responses.add(pairedResp); + continue; + } + } + notification.triggerEvents(); + return Pair.with(success, responses); + } + + /** + * Gets the media type. + * + * @param mediaTypeList the media type list + * @return the media type + */ + private String getMediaType(List mediaTypeList) { + String mediaType = MediaType.APPLICATION_JSON; // json is the default + for (MediaType mt : mediaTypeList) { + if (MediaType.APPLICATION_XML_TYPE.isCompatible(mt)) { + mediaType = MediaType.APPLICATION_XML; + } + } + return mediaType; + } + + /** + * Gets the object from db. + * + * @param serializer the serializer + * @param query the query + * @param obj the obj + * @param uri the uri + * @param depth the depth + * @param cleanUp the clean up + * @return the object from db + * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception + * @throws UnsupportedEncodingException the unsupported encoding exception + * @throws MalformedURLException the malformed URL exception + * @throws AAIUnknownObjectException + * @throws URISyntaxException + */ + private Introspector getObjectFromDb(List results, DBSerializer serializer, QueryParser query, + Introspector obj, URI uri, int depth, boolean nodeOnly, String cleanUp) + throws AAIException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, + SecurityException, InstantiationException, NoSuchMethodException, UnsupportedEncodingException, + AAIUnknownObjectException, URISyntaxException { + + // nothing found + if (results.isEmpty()) { + String msg = createNotFoundMessage(query.getResultType(), uri); + throw new AAIException("AAI_6114", msg); + } + + return serializer.dbToObject(results, obj, depth, nodeOnly, cleanUp); + + } + + /** + * Gets the object from db. + * + * @param serializer the serializer + * @param query the query + * @param obj the obj + * @param uri the uri + * @param depth the depth + * @param cleanUp the clean up + * @return the object from db + * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception + * @throws UnsupportedEncodingException the unsupported encoding exception + * @throws MalformedURLException the malformed URL exception + * @throws AAIUnknownObjectException + * @throws URISyntaxException + */ + private Introspector getRelationshipObjectFromDb(List results, DBSerializer serializer, QueryParser query, + URI uri) throws AAIException, IllegalArgumentException, SecurityException, UnsupportedEncodingException, + AAIUnknownObjectException { + + // nothing found + if (results.isEmpty()) { + String msg = createNotFoundMessage(query.getResultType(), uri); + throw new AAIException("AAI_6114", msg); + } + + if (results.size() > 1) { + throw new AAIException("AAI_6148", uri.getPath()); + } + + Vertex v = results.get(0); + return serializer.dbToRelationshipObject(v); + } + + /** + * Invoke extension. + * + * @param dbEngine the db engine + * @param g the g + * @param httpMethod the http method + * @param fromAppId the from app id + * @param apiVersion the api version + * @param loader the loader + * @param obj the obj + * @param uri the uri + * @param isPreprocess the is preprocess + * @return the response + * @throws IllegalArgumentException the illegal argument exception + * @throws UnsupportedEncodingException the unsupported encoding exception + * @throws AAIException the AAI exception + */ + private Response invokeExtension(TransactionalGraphEngine dbEngine, Graph g, HttpMethod httpMethod, + DBRequest request, String fromAppId, SchemaVersion apiVersion, Loader loader, Introspector obj, URI uri, + boolean isPreprocess) throws IllegalArgumentException, UnsupportedEncodingException, AAIException { + AAIExtensionMap aaiExtMap = new AAIExtensionMap(); + // ModelInjestor injestor = ModelInjestor.getInstance(); + Response response = null; + URIToExtensionInformation extensionInformation = new URIToExtensionInformation(loader, uri); + aaiExtMap.setHttpEntry(this); + aaiExtMap.setDbRequest(request); + aaiExtMap.setTransId(request.getTransactionId()); + aaiExtMap.setFromAppId(fromAppId); + aaiExtMap.setGraph(g); + aaiExtMap.setApiVersion(apiVersion.toString()); + aaiExtMap.setObjectFromRequest(obj); + aaiExtMap.setObjectFromRequestType(obj.getJavaClassName()); + aaiExtMap.setObjectFromResponse(obj); + aaiExtMap.setObjectFromResponseType(obj.getJavaClassName()); + aaiExtMap.setJaxbContext(nodeIngestor.getContextForVersion(apiVersion)); + aaiExtMap.setUri(uri.getRawPath()); + aaiExtMap.setTransactionalGraphEngine(dbEngine); + aaiExtMap.setLoader(loader); + aaiExtMap.setNamespace(extensionInformation.getNamespace()); + + ExtensionController ext = new ExtensionController(); + ext.runExtension(aaiExtMap.getApiVersion(), extensionInformation.getNamespace(), + extensionInformation.getTopObject(), extensionInformation.getMethodName(httpMethod, isPreprocess), + aaiExtMap, isPreprocess); + + if (aaiExtMap.getPrecheckAddedList().size() > 0) { + response = notifyOnSkeletonCreation(aaiExtMap, obj, request.getHeaders()); + } + + return response; + } + + /** + * Notify on skeleton creation. + * + * @param aaiExtMap the aai ext map + * @param input the input + * @param headers the headers + * @return the response + */ + // Legacy support + private Response notifyOnSkeletonCreation(AAIExtensionMap aaiExtMap, Introspector input, HttpHeaders headers) { + Response response = null; + HashMap> exceptionList = new HashMap>(); + + StringBuilder keyString = new StringBuilder(); + + Set resourceKeys = input.getKeys(); + for (String key : resourceKeys) { + keyString.append(key).append("=").append(input.getValue(key).toString()).append(" "); + } + + for (AAIResponseMessage msg : aaiExtMap.getPrecheckResponseMessages().getAAIResponseMessage()) { + ArrayList templateVars = new ArrayList<>(); + + templateVars.add("PUT " + input.getDbName()); + templateVars.add(keyString.toString()); + List keys = new ArrayList<>(); + templateVars.add(msg.getAaiResponseMessageResourceType()); + for (AAIResponseMessageDatum dat : msg.getAaiResponseMessageData().getAAIResponseMessageDatum()) { + keys.add(dat.getAaiResponseMessageDatumKey() + "=" + dat.getAaiResponseMessageDatumValue()); + } + templateVars.add(StringUtils.join(keys, ", ")); + exceptionList.put(new AAIException("AAI_0004", msg.getAaiResponseMessageResourceType()), templateVars); + } + response = Response.status(Status.ACCEPTED) + .entity(ErrorLogHelper.getRESTAPIInfoResponse(headers.getAcceptableMediaTypes(), exceptionList)) + .build(); + + return response; + } + + /** + * Creates the not found message. + * + * @param resultType the result type + * @param uri the uri + * @return the string + */ + private String createNotFoundMessage(String resultType, URI uri) { + + String msg = "No Node of type " + resultType + " found at: " + uri.getPath(); + + return msg; + } + + /** + * Creates the not found message. + * + * @param resultType the result type + * @param uri the uri + * @return the string + */ + private String createRelationshipNotFoundMessage(String resultType, URI uri) { + + String msg = "No relationship found of type " + resultType + " at the given URI: " + uri.getPath() + + "/relationship-list"; + + return msg; + } + + /** + * Sets the depth. + * + * @param depthParam the depth param + * @return the int + * @throws AAIException the AAI exception + */ + protected int setDepth(Introspector obj, String depthParam) throws AAIException { + int depth = AAIProperties.MAXIMUM_DEPTH; + + String getAllRandomStr = AAIConfig.get("aai.rest.getall.depthparam", ""); + if (depthParam != null && getAllRandomStr != null && !getAllRandomStr.isEmpty() + && getAllRandomStr.equals(depthParam)) { + return depth; + } + + if (depthParam == null) { + if (this.version.compareTo(schemaVersions.getDepthVersion()) >= 0) { + depth = 0; + } else { + depth = AAIProperties.MAXIMUM_DEPTH; + } + } else { + if (!depthParam.isEmpty() && !"all".equals(depthParam)) { + try { + depth = Integer.parseInt(depthParam); + } catch (Exception e) { + throw new AAIException("AAI_4016"); + } + + } + } + String maxDepth = obj.getMetadata(ObjectMetadata.MAXIMUM_DEPTH); + + int maximumDepth = AAIProperties.MAXIMUM_DEPTH; + + if (maxDepth != null) { + try { + maximumDepth = Integer.parseInt(maxDepth); + } catch (Exception ex) { + throw new AAIException("AAI_4018"); + } + } + + if (depth > maximumDepth) { + throw new AAIException("AAI_3303"); + } + + return depth; + } + + /** + * Checks if is modification method. + * + * @param method the method + * @return true, if is modification method + */ + private boolean isModificationMethod(HttpMethod method) { + boolean result = false; + + if (method.equals(HttpMethod.PUT) || method.equals(HttpMethod.PUT_EDGE) || method.equals(HttpMethod.DELETE_EDGE) + || method.equals(HttpMethod.MERGE_PATCH)) { + result = true; + } + + return result; + + } + + /** + * Given an uri, introspector object and loader object + * it will check if the obj is top level object if it is, + * it will return immediately returning the uri passed in + * If it isn't, it will go through, get the uriTemplate + * from the introspector object and get the count of "/"s + * and remove that part of the uri using substring + * and keep doing that until the current object is top level + * Also added the max depth just so worst case scenario + * Then keep adding aai-uri to the list include the aai-uri passed in + * Convert that list into an array and return it + *

+ * + * Example: + * + *

+ * aai-uri -> + * /cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant1/vservers/vserver/v1 + * + * Given the uriTemplate vserver -> /vservers/vserver/{vserver-id} + * it converts to /vservers/vserver + * + * lastIndexOf /vservers/vserver in + * /cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant1/vservers/vserver/v1 + * ^ + * | + * | + * lastIndexOf + * Use substring to get the string from 0 to that lastIndexOf + * aai-uri -> /cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant1 + * + * From this new aai-uri, generate a introspector from the URITOObject class + * and keep doing this until you + * + *
+ * + * @param aaiUri - aai-uri of the vertex representating the unique id of a given vertex + * @param obj - introspector object of the given starting vertex + * @param loader - Type of loader which will always be MoxyLoader to support model driven + * @return an array of strings which can be used to get the vertexes of parent and grand parents from a given vertex + * @throws UnsupportedEncodingException + * @throws AAIException + */ + String[] convertIntrospectorToUriList(String aaiUri, Introspector obj, Loader loader) + throws UnsupportedEncodingException, AAIException { + + List uriList = new ArrayList<>(); + String template = StringUtils.EMPTY; + String truncatedUri = aaiUri; + int depth = AAIProperties.MAXIMUM_DEPTH; + uriList.add(truncatedUri); + + while (depth >= 0 && !obj.isTopLevel()) { + template = obj.getMetadata(ObjectMetadata.URI_TEMPLATE); + + if (template == null) { + LOGGER.warn("Unable to find the uriTemplate for the object {}", obj.getDbName()); + return null; + } + + int templateCount = StringUtils.countMatches(template, "/"); + int truncatedUriCount = StringUtils.countMatches(truncatedUri, "/"); + + if (templateCount > truncatedUriCount) { + LOGGER.warn("Template uri {} contains more slashes than truncatedUri {}", template, truncatedUri); + return null; + } + + int cutIndex = StringUtils.ordinalIndexOf(truncatedUri, "/", truncatedUriCount - templateCount + 1); + truncatedUri = StringUtils.substring(truncatedUri, 0, cutIndex); + uriList.add(truncatedUri); + obj = new URIToObject(loader, UriBuilder.fromPath(truncatedUri).build()).getEntity(); + depth--; + } + + return uriList.toArray(new String[uriList.size()]); + } + + /** + * + * @param serializer + * @param queryEngine + * @param v + * @param obj + * @param loader + * @return + * @throws IllegalAccessException + * @throws IllegalArgumentException + * @throws InvocationTargetException + * @throws SecurityException + * @throws InstantiationException + * @throws NoSuchMethodException + * @throws UnsupportedEncodingException + * @throws AAIException + * @throws URISyntaxException + */ + private HashMap getRelatedObjects(DBSerializer serializer, QueryEngine queryEngine, Vertex v, + Introspector obj, Loader loader) throws IllegalAccessException, IllegalArgumentException, + InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, + UnsupportedEncodingException, AAIException, URISyntaxException { + + HashMap relatedVertices = new HashMap<>(); + VertexProperty aaiUriProperty = v.property(AAIProperties.AAI_URI); + + if (!aaiUriProperty.isPresent()) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("For the given vertex {}, it seems aai-uri is not present so not getting related objects", + v.id().toString()); + } else { + LOGGER.info( + "It seems aai-uri is not present in vertex, so not getting related objects, for more info enable debug log"); + } + return relatedVertices; + } + + String aaiUri = aaiUriProperty.value().toString(); + + if (!obj.isTopLevel()) { + String[] uriList = convertIntrospectorToUriList(aaiUri, obj, loader); + List vertexChain = null; + // If the uriList is null then there is something wrong with converting the uri + // into a list of aai-uris so falling back to the old mechanism for finding parents + if (uriList == null) { + LOGGER.info( + "Falling back to the old mechanism due to unable to convert aai-uri to list of uris but this is not optimal"); + vertexChain = queryEngine.findParents(v); + } else { + vertexChain = queryEngine.findParents(uriList); + } + for (Vertex vertex : vertexChain) { + try { + final Introspector vertexObj = serializer.getVertexProperties(vertex); + relatedVertices.put(vertexObj.getObjectId(), vertexObj); + } catch (AAIUnknownObjectException e) { + LOGGER.warn("Unable to get vertex properties, partial list of related vertices returned"); + } + } + } else { + try { + final Introspector vertexObj = serializer.getVertexProperties(v); + relatedVertices.put(vertexObj.getObjectId(), vertexObj); + } catch (AAIUnknownObjectException e) { + LOGGER.warn("Unable to get vertex properties, partial list of related vertices returned"); + } + } + + return relatedVertices; + } + + private Map buildIntrospectorObjects(DBSerializer serializer, Iterable vertices) { + Map deleteObjectMap = new HashMap<>(); + for (Vertex vertex : vertices) { + try { + // deleteObjectMap.computeIfAbsent(vertex, s -> + // serializer.getLatestVersionView(vertex)); + Introspector deleteObj = serializer.getLatestVersionView(vertex); + deleteObjectMap.put(vertex, deleteObj); + } catch (UnsupportedEncodingException | AAIException e) { + LOGGER.warn("Unable to get Introspctor Objects, Just continue"); + continue; + } + + } + + return deleteObjectMap; + + } + + private Map buildURIMap(DBSerializer serializer, Map introSpector) { + Map uriMap = new HashMap<>(); + for (Map.Entry entry : introSpector.entrySet()) { + URI uri; + try { + uri = serializer.getURIForVertex(entry.getKey()); + if (null != entry.getValue()) { + uriMap.put(entry.getValue().getObjectId(), uri); + } + } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unable to get URIs, Just continue"); + continue; + } + + } + + return uriMap; + + } + + private Map> buildRelatedObjects(DBSerializer serializer, + QueryEngine queryEngine, Map introSpector) { + + Map> relatedObjectsMap = new HashMap<>(); + for (Map.Entry entry : introSpector.entrySet()) { + try { + HashMap relatedObjects = + this.getRelatedObjects(serializer, queryEngine, entry.getKey(), entry.getValue(), this.loader); + if (null != entry.getValue()) { + relatedObjectsMap.put(entry.getValue().getObjectId(), relatedObjects); + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException + | InstantiationException | NoSuchMethodException | UnsupportedEncodingException | AAIException + | URISyntaxException e) { + LOGGER.warn("Unable to get realted Objects, Just continue"); + continue; + } + + } + + return relatedObjectsMap; + + } + + private void buildNotificationEvent(String sourceOfTruth, Status status, String transactionId, + UEBNotification notification, Map deleteObjects, Map uriMap, + Map> deleteRelatedObjects, String basePath) { + for (Map.Entry entry : deleteObjects.entrySet()) { + try { + String vertexObjectId = ""; + + if (null != entry.getValue()) { + vertexObjectId = entry.getValue().getObjectId(); + + if (uriMap.containsKey(vertexObjectId) && deleteRelatedObjects.containsKey(vertexObjectId)) { + notification.createNotificationEvent(transactionId, sourceOfTruth, status, + uriMap.get(vertexObjectId), entry.getValue(), deleteRelatedObjects.get(vertexObjectId), + basePath); + } + } + } catch (UnsupportedEncodingException | AAIException e) { + + LOGGER.warn("Error in sending notification"); + } + } + } + + public void setPaginationParameters(String resultIndex, String resultSize) { + if (resultIndex != null && resultIndex != "-1" && resultSize != null && resultSize != "-1") { + this.setPaginationIndex(Integer.parseInt(resultIndex)); + this.setPaginationBucket(Integer.parseInt(resultSize)); + } + } + + public List getPaginatedVertexList(List vertexList) throws AAIException { + List vertices; + if (this.isPaginated()) { + this.setTotalsForPaging(vertexList.size(), this.getPaginationBucket()); + int startIndex = (this.getPaginationIndex() - 1) * this.getPaginationBucket(); + int endIndex = Math.min((this.getPaginationBucket() * this.getPaginationIndex()), vertexList.size()); + if (startIndex > endIndex) { + throw new AAIException("AAI_6150", + " ResultIndex is not appropriate for the result set, Needs to be <= " + endIndex); + } + vertices = vertexList.subList(startIndex, endIndex); + } else { + vertices = vertexList; + } + return vertices; + } } diff --git a/aai-core/src/main/java/org/onap/aai/rest/ueb/NotificationEvent.java b/aai-core/src/main/java/org/onap/aai/rest/ueb/NotificationEvent.java index 5dafebd6..61beb8d0 100644 --- a/aai-core/src/main/java/org/onap/aai/rest/ueb/NotificationEvent.java +++ b/aai-core/src/main/java/org/onap/aai/rest/ueb/NotificationEvent.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.ueb; import org.onap.aai.exceptions.AAIException; @@ -30,68 +31,67 @@ import org.onap.aai.util.StoreNotificationEvent; */ public class NotificationEvent { - private final Loader loader; - - private final Introspector eventHeader; - - private final Introspector obj; - private final String transactionId; - private final String sourceOfTruth; - /** - * Instantiates a new notification event. - * - * @param eventHeader the event header - * @param obj the obj - */ - public NotificationEvent (Loader loader, Introspector eventHeader, Introspector obj, String transactionId, String sourceOfTruth) { - this.loader = loader; - this.eventHeader = eventHeader; - this.obj = obj; - this.transactionId = transactionId; - this.sourceOfTruth = sourceOfTruth; - } - - /** - * Trigger. - * - * @throws AAIException the AAI exception - */ - public void trigger() throws AAIException { - - StoreNotificationEvent sne = new StoreNotificationEvent(transactionId, sourceOfTruth); - - sne.storeEvent(loader, eventHeader, obj); + private final Loader loader; + + private final Introspector eventHeader; + + private final Introspector obj; + private final String transactionId; + private final String sourceOfTruth; + + /** + * Instantiates a new notification event. + * + * @param eventHeader the event header + * @param obj the obj + */ + public NotificationEvent(Loader loader, Introspector eventHeader, Introspector obj, String transactionId, + String sourceOfTruth) { + this.loader = loader; + this.eventHeader = eventHeader; + this.obj = obj; + this.transactionId = transactionId; + this.sourceOfTruth = sourceOfTruth; + } + + /** + * Trigger. + * + * @throws AAIException the AAI exception + */ + public void trigger() throws AAIException { + + StoreNotificationEvent sne = new StoreNotificationEvent(transactionId, sourceOfTruth); + + sne.storeEvent(loader, eventHeader, obj); + + } + + /** + * Gets the notification version. + * + * @return the notification version + */ + public SchemaVersion getNotificationVersion() { + return loader.getVersion(); + } + + /** + * Gets the event header. + * + * @return the event header + */ + public Introspector getEventHeader() { + return eventHeader; + } + + /** + * Gets the obj. + * + * @return the obj + */ + public Introspector getObj() { + return obj; + } - } - - /** - * Gets the notification version. - * - * @return the notification version - */ - public SchemaVersion getNotificationVersion() { - return loader.getVersion(); - } - - /** - * Gets the event header. - * - * @return the event header - */ - public Introspector getEventHeader() { - return eventHeader; - } - - /** - * Gets the obj. - * - * @return the obj - */ - public Introspector getObj() { - return obj; - } - - - - } diff --git a/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java b/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java index f5f1e14a..b189c050 100644 --- a/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java +++ b/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java @@ -17,8 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.ueb; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.ArrayList; @@ -32,161 +36,159 @@ import org.onap.aai.exceptions.AAIException; import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; import org.onap.aai.introspection.LoaderFactory; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; import org.onap.aai.introspection.exceptions.AAIUnmarshallingException; import org.onap.aai.logging.LogFormatTools; import org.onap.aai.parsers.uri.URIToObject; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; +import org.onap.aai.setup.SchemaVersion; +import org.onap.aai.setup.SchemaVersions; /** * The Class UEBNotification. */ public class UEBNotification { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(UEBNotification.class); - - private Loader currentVersionLoader = null; - protected List events = null; - private SchemaVersion notificationVersion = null; - /** - * Instantiates a new UEB notification. - * - * @param loader the loader - */ - public UEBNotification(Loader loader, LoaderFactory loaderFactory, SchemaVersions schemaVersions) { - events = new ArrayList<>(); - SchemaVersion defaultVersion = schemaVersions.getDefaultVersion(); - currentVersionLoader = loaderFactory.createLoaderForVersion(loader.getModelType(), defaultVersion); - notificationVersion = defaultVersion; - } - - - /** - * Creates the notification event. - * - * @param transactionId the X-TransactionId - * @param sourceOfTruth - * @param status the status - * @param uri the uri - * @param obj the obj - * @param basePath base URI path - * @throws AAIException the AAI exception - * @throws IllegalArgumentException the illegal argument exception - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - public void createNotificationEvent(String transactionId, String sourceOfTruth, Status status, URI uri, Introspector obj, HashMap relatedObjects, String basePath) throws AAIException, UnsupportedEncodingException { - - String action = "UPDATE"; - - if (status.equals(Status.CREATED)) { - action = "CREATE"; - } else if (status.equals(Status.OK)) { - action = "UPDATE"; - } else if (status.equals(Status.NO_CONTENT)) { - action = "DELETE"; - } - - try { - Introspector eventHeader = currentVersionLoader.introspectorFromName("notification-event-header"); - URIToObject parser = new URIToObject(currentVersionLoader, uri, relatedObjects); - - String entityLink = ""; - if ((basePath != null) && (!basePath.isEmpty())) { - if (!(basePath.startsWith("/"))) { - basePath = "/" + basePath; - } - if (!(basePath.endsWith("/"))) { - basePath = basePath + "/"; - } - } else { - // default - basePath = "/aai/"; - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("Please check the schema.uri.base.path as it didn't seem to be set"); - } - } - - if (uri.toString().startsWith("/")) { - entityLink = basePath + notificationVersion + uri; - } else { - entityLink = basePath + notificationVersion + "/" + uri; - } - - - eventHeader.setValue("entity-link", entityLink); - eventHeader.setValue("action", action); - eventHeader.setValue("entity-type", obj.getDbName()); - eventHeader.setValue("top-entity-type", parser.getTopEntityName()); - eventHeader.setValue("source-name", sourceOfTruth); - eventHeader.setValue("version", notificationVersion.toString()); - eventHeader.setValue("id", transactionId); - - List parentList = parser.getParentList(); - parentList.clear(); - - if (!parser.getTopEntity().equals(parser.getEntity())) { - Introspector child = obj; - if (!parser.getLoader().getVersion().equals(obj.getVersion())) { - String json = obj.marshal(false); - child = parser.getLoader().unmarshal(parser.getEntity().getName(), json); - } - - //wrap the child object in its parents - parentList.add(child.getUnderlyingObject()); - } - - final Introspector eventObject; - - //convert to most resent version - if (!parser.getLoader().getVersion().equals(currentVersionLoader.getVersion())) { - String json = ""; - if (parser.getTopEntity().equals(parser.getEntity())) { - //convert the parent object passed in - json = obj.marshal(false); - eventObject = currentVersionLoader.unmarshal(obj.getName(), json); - } else { - //convert the object created in the parser - json = parser.getTopEntity().marshal(false); - eventObject = currentVersionLoader.unmarshal(parser.getTopEntity().getName(), json); - } - } else { - if (parser.getTopEntity().equals(parser.getEntity())) { - //take the top level parent object passed in - eventObject = obj; - } else { - //take the wrapped child objects (ogres are like onions) - eventObject = parser.getTopEntity(); - } - } - final NotificationEvent event = new NotificationEvent(currentVersionLoader, eventHeader, eventObject, transactionId, sourceOfTruth); - events.add(event); - } catch (AAIUnknownObjectException e) { - throw new RuntimeException("Fatal error - notification-event-header object not found!"); - } catch (AAIUnmarshallingException e) { - LOGGER.error("Unmarshalling error occurred while generating UEBNotification " + LogFormatTools.getStackTop(e)); - } - } - - /** - * Trigger events. - * - * @throws AAIException the AAI exception - */ - public void triggerEvents() throws AAIException { - for (NotificationEvent event : events) { - event.trigger(); - } - events.clear(); - } - - public List getEvents() { - return this.events; - } - - + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(UEBNotification.class); + + private Loader currentVersionLoader = null; + protected List events = null; + private SchemaVersion notificationVersion = null; + + /** + * Instantiates a new UEB notification. + * + * @param loader the loader + */ + public UEBNotification(Loader loader, LoaderFactory loaderFactory, SchemaVersions schemaVersions) { + events = new ArrayList<>(); + SchemaVersion defaultVersion = schemaVersions.getDefaultVersion(); + currentVersionLoader = loaderFactory.createLoaderForVersion(loader.getModelType(), defaultVersion); + notificationVersion = defaultVersion; + } + + /** + * Creates the notification event. + * + * @param transactionId the X-TransactionId + * @param sourceOfTruth + * @param status the status + * @param uri the uri + * @param obj the obj + * @param basePath base URI path + * @throws AAIException the AAI exception + * @throws IllegalArgumentException the illegal argument exception + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + public void createNotificationEvent(String transactionId, String sourceOfTruth, Status status, URI uri, + Introspector obj, HashMap relatedObjects, String basePath) + throws AAIException, UnsupportedEncodingException { + + String action = "UPDATE"; + + if (status.equals(Status.CREATED)) { + action = "CREATE"; + } else if (status.equals(Status.OK)) { + action = "UPDATE"; + } else if (status.equals(Status.NO_CONTENT)) { + action = "DELETE"; + } + + try { + Introspector eventHeader = currentVersionLoader.introspectorFromName("notification-event-header"); + URIToObject parser = new URIToObject(currentVersionLoader, uri, relatedObjects); + + String entityLink = ""; + if ((basePath != null) && (!basePath.isEmpty())) { + if (!(basePath.startsWith("/"))) { + basePath = "/" + basePath; + } + if (!(basePath.endsWith("/"))) { + basePath = basePath + "/"; + } + } else { + // default + basePath = "/aai/"; + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Please check the schema.uri.base.path as it didn't seem to be set"); + } + } + + if (uri.toString().startsWith("/")) { + entityLink = basePath + notificationVersion + uri; + } else { + entityLink = basePath + notificationVersion + "/" + uri; + } + + eventHeader.setValue("entity-link", entityLink); + eventHeader.setValue("action", action); + eventHeader.setValue("entity-type", obj.getDbName()); + eventHeader.setValue("top-entity-type", parser.getTopEntityName()); + eventHeader.setValue("source-name", sourceOfTruth); + eventHeader.setValue("version", notificationVersion.toString()); + eventHeader.setValue("id", transactionId); + + List parentList = parser.getParentList(); + parentList.clear(); + + if (!parser.getTopEntity().equals(parser.getEntity())) { + Introspector child = obj; + if (!parser.getLoader().getVersion().equals(obj.getVersion())) { + String json = obj.marshal(false); + child = parser.getLoader().unmarshal(parser.getEntity().getName(), json); + } + + // wrap the child object in its parents + parentList.add(child.getUnderlyingObject()); + } + + final Introspector eventObject; + + // convert to most resent version + if (!parser.getLoader().getVersion().equals(currentVersionLoader.getVersion())) { + String json = ""; + if (parser.getTopEntity().equals(parser.getEntity())) { + // convert the parent object passed in + json = obj.marshal(false); + eventObject = currentVersionLoader.unmarshal(obj.getName(), json); + } else { + // convert the object created in the parser + json = parser.getTopEntity().marshal(false); + eventObject = currentVersionLoader.unmarshal(parser.getTopEntity().getName(), json); + } + } else { + if (parser.getTopEntity().equals(parser.getEntity())) { + // take the top level parent object passed in + eventObject = obj; + } else { + // take the wrapped child objects (ogres are like onions) + eventObject = parser.getTopEntity(); + } + } + final NotificationEvent event = + new NotificationEvent(currentVersionLoader, eventHeader, eventObject, transactionId, sourceOfTruth); + events.add(event); + } catch (AAIUnknownObjectException e) { + throw new RuntimeException("Fatal error - notification-event-header object not found!"); + } catch (AAIUnmarshallingException e) { + LOGGER.error( + "Unmarshalling error occurred while generating UEBNotification " + LogFormatTools.getStackTop(e)); + } + } + + /** + * Trigger events. + * + * @throws AAIException the AAI exception + */ + public void triggerEvents() throws AAIException { + for (NotificationEvent event : events) { + event.trigger(); + } + events.clear(); + } + + public List getEvents() { + return this.events; + } } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/CustomJacksonJaxBJsonProvider.java b/aai-core/src/main/java/org/onap/aai/restcore/CustomJacksonJaxBJsonProvider.java index 44bcb8a5..1e9bb05b 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/CustomJacksonJaxBJsonProvider.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/CustomJacksonJaxBJsonProvider.java @@ -17,9 +17,8 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.restcore; -import javax.ws.rs.ext.Provider; +package org.onap.aai.restcore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -28,43 +27,45 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import javax.ws.rs.ext.Provider; + /** * The Class CustomJacksonJaxBJsonProvider. */ @Provider public class CustomJacksonJaxBJsonProvider extends JacksonJaxbJsonProvider { - private static ObjectMapper commonMapper = null; + private static ObjectMapper commonMapper = null; + + /** + * Instantiates a new custom jackson jax B json provider. + */ + public CustomJacksonJaxBJsonProvider() { + if (commonMapper == null) { + ObjectMapper mapper = new ObjectMapper(); + + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - /** - * Instantiates a new custom jackson jax B json provider. - */ - public CustomJacksonJaxBJsonProvider() { - if (commonMapper == null) { - ObjectMapper mapper = new ObjectMapper(); + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.configure(SerializationFeature.INDENT_OUTPUT, false); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.INDENT_OUTPUT, false); - mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false); + mapper.registerModule(new JaxbAnnotationModule()); - mapper.registerModule(new JaxbAnnotationModule()); + commonMapper = mapper; + } + super.setMapper(commonMapper); + } - commonMapper = mapper; - } - super.setMapper(commonMapper); - } - - /** - * Gets the mapper. - * - * @return the mapper - */ - public ObjectMapper getMapper() { - return commonMapper; - } + /** + * Gets the mapper. + * + * @return the mapper + */ + public ObjectMapper getMapper() { + return commonMapper; + } } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/HttpMethod.java b/aai-core/src/main/java/org/onap/aai/restcore/HttpMethod.java index 54215d6a..c6b59472 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/HttpMethod.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/HttpMethod.java @@ -17,17 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore; /** * The Enum HttpMethod. */ public enum HttpMethod { - PUT, - MERGE_PATCH, - DELETE, - PUT_EDGE, - DELETE_EDGE, - GET, - GET_RELATIONSHIP; + PUT, MERGE_PATCH, DELETE, PUT_EDGE, DELETE_EDGE, GET, GET_RELATIONSHIP; } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/JettyObfuscationConversionCommandLineUtil.java b/aai-core/src/main/java/org/onap/aai/restcore/JettyObfuscationConversionCommandLineUtil.java index b4d04246..3e995d64 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/JettyObfuscationConversionCommandLineUtil.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/JettyObfuscationConversionCommandLineUtil.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore; import org.apache.commons.cli.BasicParser; @@ -47,50 +48,50 @@ import org.eclipse.jetty.util.security.Password; * the-secret-to-hide-the-secret problem. */ public class JettyObfuscationConversionCommandLineUtil { - - /** - * The main method. - * - * @param args the arguments - */ - public static void main(String[] args){ - Options options = new Options(); - options.addOption("e", true, "obfuscate the given string"); - options.addOption("d", true, "deobfuscate the given string"); - - CommandLineParser parser = new BasicParser(); - - try { - CommandLine cmd = parser.parse(options, args); - String toProcess = null; - - if (cmd.hasOption("e")){ - toProcess = cmd.getOptionValue("e"); - String encoded = Password.obfuscate(toProcess); - System.out.println(encoded); - } else if (cmd.hasOption("d")) { - toProcess = cmd.getOptionValue("d"); - String decoded_str = Password.deobfuscate(toProcess); - System.out.println(decoded_str); - } else { - usage(); - } - } catch (ParseException e) { - System.out.println("failed to parse input"); - System.out.println(e.toString()); - usage(); - } catch (Exception e) { - System.out.println("exception:" + e.toString()); - } - } - - /** - * Usage. - */ - private static void usage(){ - System.out.println("usage:");; - System.out.println("-e [string] to obfuscate"); - System.out.println("-d [string] to deobfuscate"); - System.out.println("-h help"); - } + + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args) { + Options options = new Options(); + options.addOption("e", true, "obfuscate the given string"); + options.addOption("d", true, "deobfuscate the given string"); + + CommandLineParser parser = new BasicParser(); + + try { + CommandLine cmd = parser.parse(options, args); + String toProcess = null; + + if (cmd.hasOption("e")) { + toProcess = cmd.getOptionValue("e"); + String encoded = Password.obfuscate(toProcess); + System.out.println(encoded); + } else if (cmd.hasOption("d")) { + toProcess = cmd.getOptionValue("d"); + String decoded_str = Password.deobfuscate(toProcess); + System.out.println(decoded_str); + } else { + usage(); + } + } catch (ParseException e) { + System.out.println("failed to parse input"); + System.out.println(e.toString()); + usage(); + } catch (Exception e) { + System.out.println("exception:" + e.toString()); + } + } + + /** + * Usage. + */ + private static void usage() { + System.out.println("usage:");; + System.out.println("-e [string] to obfuscate"); + System.out.println("-d [string] to deobfuscate"); + System.out.println("-h help"); + } } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/MediaType.java b/aai-core/src/main/java/org/onap/aai/restcore/MediaType.java index 66344a69..409c84cc 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/MediaType.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/MediaType.java @@ -17,16 +17,16 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore; /** * The Enum MediaType. */ public enum MediaType { - APPLICATION_JSON_TYPE("application/json"), - APPLICATION_XML_TYPE("application/xml"); - - private final String text; + APPLICATION_JSON_TYPE("application/json"), APPLICATION_XML_TYPE("application/xml"); + + private final String text; /** * Instantiates a new media type. @@ -36,7 +36,7 @@ public enum MediaType { private MediaType(final String text) { this.text = text; } - + /** * Gets the enum. * @@ -44,20 +44,20 @@ public enum MediaType { * @return the enum */ public static MediaType getEnum(String value) { - - for(MediaType v : values()) { - if(v.toString().equalsIgnoreCase(value)) { - return v; - } - } - + + for (MediaType v : values()) { + if (v.toString().equalsIgnoreCase(value)) { + return v; + } + } + throw new IllegalArgumentException("bad value: " + value); - + } - + /** - * @{inheritDoc} - */ + * @{inheritDoc} + */ @Override public String toString() { return text; diff --git a/aai-core/src/main/java/org/onap/aai/restcore/RESTAPI.java b/aai-core/src/main/java/org/onap/aai/restcore/RESTAPI.java index 1b3796e2..ae102a83 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/RESTAPI.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/RESTAPI.java @@ -17,19 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.common.base.Joiner; + import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.Callable; import java.util.concurrent.TimeoutException; import javax.ws.rs.core.HttpHeaders; @@ -53,346 +58,343 @@ import org.onap.aai.logging.LoggingContext; import org.onap.aai.util.AAIConfig; import org.onap.aai.util.FormatDate; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import com.google.common.base.Joiner; - - /** * Base class for AAI REST API classes. * Provides method to validate header information * TODO should authenticate caller and authorize them for the API they are calling * TODO should store the transaction - * + * */ public class RESTAPI { - - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(RESTAPI.class); - - protected final String COMPONENT = "aairest"; - - /** - * The Enum Action. - */ - public enum Action { - GET, PUT, POST, DELETE - }; - - /** - * Gets the from app id. - * - * @param headers the headers - * @return the from app id - * @throws AAIException the AAI exception - */ - protected String getFromAppId(HttpHeaders headers) throws AAIException { - String fromAppId = null; - if (headers != null) { - List fromAppIdHeader = headers.getRequestHeader("X-FromAppId"); - if (fromAppIdHeader != null) { - for (String fromAppIdValue : fromAppIdHeader) { - fromAppId = fromAppIdValue; - } - } - } - - if (fromAppId == null) { - throw new AAIException("AAI_4009"); - } - - LoggingContext.partnerName(fromAppId); - - return fromAppId; - } - - /** - * Gets the trans id. - * - * @param headers the headers - * @return the trans id - * @throws AAIException the AAI exception - */ - protected String getTransId(HttpHeaders headers) throws AAIException { - String transId = null; - if (headers != null) { - List transIdHeader = headers.getRequestHeader("X-TransactionId"); - if (transIdHeader != null) { - for (String transIdValue : transIdHeader) { - transId = transIdValue; - } - } - } - - if (transId == null) { - throw new AAIException("AAI_4010"); - } - - LoggingContext.requestId(transId); - - return transId; - } - - - /** - * Gen date. - * - * @return the string - */ - protected String genDate() { - FormatDate fd = new FormatDate( "YYMMdd-HH:mm:ss:SSS"); - - return fd.getDateTime(); - } - - /** - * Gets the media type. - * - * @param mediaTypeList the media type list - * @return the media type - */ - protected String getMediaType(List mediaTypeList) { - String mediaType = MediaType.APPLICATION_JSON; // json is the default - for (MediaType mt : mediaTypeList) { - if (MediaType.APPLICATION_XML_TYPE.isCompatible(mt)) { - mediaType = MediaType.APPLICATION_XML; - } - } - return mediaType; - } - - - /* ----------helpers for common consumer actions ----------- */ - - /** - * Sets the depth. - * - * @param depthParam the depth param - * @return the int - * @throws AAIException the AAI exception - */ - protected int setDepth(String depthParam) throws AAIException { - int depth = AAIProperties.MAXIMUM_DEPTH; //default - if (depthParam != null && depthParam.length() > 0 && !depthParam.equals("all")){ - try { - depth = Integer.valueOf(depthParam); - } catch (Exception e) { - throw new AAIException("AAI_4016"); - } - } - return depth; - } - - /** - * Consumer exception response generator. - * - * @param headers the headers - * @param info the info - * @param templateAction the template action - * @param e the e - * @return the response - */ - protected Response consumerExceptionResponseGenerator(HttpHeaders headers, UriInfo info, HttpMethod templateAction, AAIException e) { - ArrayList templateVars = new ArrayList(); - templateVars.add(templateAction.toString()); //GET, PUT, etc - templateVars.add(info.getPath().toString()); - templateVars.addAll(e.getTemplateVars()); - - ErrorLogHelper.logException(e); - return Response - .status(e.getErrorObject().getHTTPResponseCode()) - .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), e, templateVars)) - .build(); - } - - /** - * Validate introspector. - * - * @param obj the obj - * @param loader the loader - * @param uri the uri - * @throws AAIException the AAI exception - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - protected void validateIntrospector(Introspector obj, Loader loader, URI uri, HttpMethod method) throws AAIException, UnsupportedEncodingException { - - int maximumDepth = AAIProperties.MAXIMUM_DEPTH; - boolean validateRequired = true; - if (method.equals(HttpMethod.MERGE_PATCH)) { - validateRequired = false; - maximumDepth = 0; - } - IntrospectorValidator validator = new IntrospectorValidator.Builder() - .validateRequired(validateRequired) - .restrictDepth(maximumDepth) - .addResolver(new RemoveNonVisibleProperty()) - .addResolver(new CreateUUID()) - .addResolver(new DefaultFields()) - .addResolver(new InjectKeysFromURI(loader, uri)) - .build(); - boolean result = validator.validate(obj); - if (!result) { - result = validator.resolveIssues(); - } - if (!result) { - List messages = new ArrayList<>(); - for (Issue issue : validator.getIssues()) { - if (!issue.isResolved()) { - messages.add(issue.getDetail()); - } - } - String errors = Joiner.on(",").join(messages); - throw new AAIException("AAI_3000", errors); - } - //check that key in payload and key in request uri are the same + + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(RESTAPI.class); + + protected final String COMPONENT = "aairest"; + + /** + * The Enum Action. + */ + public enum Action { + GET, PUT, POST, DELETE + }; + + /** + * Gets the from app id. + * + * @param headers the headers + * @return the from app id + * @throws AAIException the AAI exception + */ + protected String getFromAppId(HttpHeaders headers) throws AAIException { + String fromAppId = null; + if (headers != null) { + List fromAppIdHeader = headers.getRequestHeader("X-FromAppId"); + if (fromAppIdHeader != null) { + for (String fromAppIdValue : fromAppIdHeader) { + fromAppId = fromAppIdValue; + } + } + } + + if (fromAppId == null) { + throw new AAIException("AAI_4009"); + } + + LoggingContext.partnerName(fromAppId); + + return fromAppId; + } + + /** + * Gets the trans id. + * + * @param headers the headers + * @return the trans id + * @throws AAIException the AAI exception + */ + protected String getTransId(HttpHeaders headers) throws AAIException { + String transId = null; + if (headers != null) { + List transIdHeader = headers.getRequestHeader("X-TransactionId"); + if (transIdHeader != null) { + for (String transIdValue : transIdHeader) { + transId = transIdValue; + } + } + } + + if (transId == null) { + throw new AAIException("AAI_4010"); + } + + LoggingContext.requestId(transId); + + return transId; + } + + /** + * Gen date. + * + * @return the string + */ + protected String genDate() { + FormatDate fd = new FormatDate("YYMMdd-HH:mm:ss:SSS"); + + return fd.getDateTime(); + } + + /** + * Gets the media type. + * + * @param mediaTypeList the media type list + * @return the media type + */ + protected String getMediaType(List mediaTypeList) { + String mediaType = MediaType.APPLICATION_JSON; // json is the default + for (MediaType mt : mediaTypeList) { + if (MediaType.APPLICATION_XML_TYPE.isCompatible(mt)) { + mediaType = MediaType.APPLICATION_XML; + } + } + return mediaType; + } + + /* ----------helpers for common consumer actions ----------- */ + + /** + * Sets the depth. + * + * @param depthParam the depth param + * @return the int + * @throws AAIException the AAI exception + */ + protected int setDepth(String depthParam) throws AAIException { + int depth = AAIProperties.MAXIMUM_DEPTH; // default + if (depthParam != null && depthParam.length() > 0 && !depthParam.equals("all")) { + try { + depth = Integer.valueOf(depthParam); + } catch (Exception e) { + throw new AAIException("AAI_4016"); + } + } + return depth; + } + + /** + * Consumer exception response generator. + * + * @param headers the headers + * @param info the info + * @param templateAction the template action + * @param e the e + * @return the response + */ + protected Response consumerExceptionResponseGenerator(HttpHeaders headers, UriInfo info, HttpMethod templateAction, + AAIException e) { + ArrayList templateVars = new ArrayList(); + templateVars.add(templateAction.toString()); // GET, PUT, etc + templateVars.add(info.getPath().toString()); + templateVars.addAll(e.getTemplateVars()); + + ErrorLogHelper.logException(e); + return Response + .status(e.getErrorObject().getHTTPResponseCode()).entity(ErrorLogHelper + .getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), e, templateVars)) + .build(); + } + + /** + * Validate introspector. + * + * @param obj the obj + * @param loader the loader + * @param uri the uri + * @throws AAIException the AAI exception + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + protected void validateIntrospector(Introspector obj, Loader loader, URI uri, HttpMethod method) + throws AAIException, UnsupportedEncodingException { + + int maximumDepth = AAIProperties.MAXIMUM_DEPTH; + boolean validateRequired = true; + if (method.equals(HttpMethod.MERGE_PATCH)) { + validateRequired = false; + maximumDepth = 0; + } + IntrospectorValidator validator = new IntrospectorValidator.Builder().validateRequired(validateRequired) + .restrictDepth(maximumDepth).addResolver(new RemoveNonVisibleProperty()).addResolver(new CreateUUID()) + .addResolver(new DefaultFields()).addResolver(new InjectKeysFromURI(loader, uri)).build(); + boolean result = validator.validate(obj); + if (!result) { + result = validator.resolveIssues(); + } + if (!result) { + List messages = new ArrayList<>(); + for (Issue issue : validator.getIssues()) { + if (!issue.isResolved()) { + messages.add(issue.getDetail()); + } + } + String errors = Joiner.on(",").join(messages); + throw new AAIException("AAI_3000", errors); + } + // check that key in payload and key in request uri are the same String objURI = obj.getURI(); - //if requested object is a parent objURI will have a leading slash the input uri will lack - //this adds that leading slash for the comparison + // if requested object is a parent objURI will have a leading slash the input uri will lack + // this adds that leading slash for the comparison String testURI = "/" + uri.getRawPath(); if (!testURI.endsWith(objURI)) { - throw new AAIException("AAI_3000", "uri and payload keys don't match"); + throw new AAIException("AAI_3000", "uri and payload keys don't match"); } - } - - protected DBConnectionType determineConnectionType(String fromAppId, String realTime) throws AAIException { - if (fromAppId == null) { - throw new AAIException("AAI_4009", "X-FromAppId is not set"); - } - - DBConnectionType type = DBConnectionType.REALTIME; - boolean isRealTimeClient = AAIConfig.get("aai.realtime.clients", "").contains(fromAppId); - if (isRealTimeClient || realTime != null) { - type = DBConnectionType.REALTIME; - } else { - type = DBConnectionType.CACHED; - } - - return type; - } - - /** - * Gets the input media type. - * - * @param mediaType the media type - * @return the input media type - */ - protected String getInputMediaType(MediaType mediaType) { - String result = mediaType.getType() + "/" + mediaType.getSubtype(); - - return result; - - } - - /** - * Returns the app specific timeout in milliseconds, -1 overrides the timeout for an app - * - * @param sot - * @param appTimeouts - * @param defaultTimeout - * @return integer timeout in or -1 to bypass - * @throws AAIException - */ - - public int getTimeoutLimit(String sot, String appTimeouts, String defaultTimeout) throws AAIException{ - String[] ignoreAppIds = (appTimeouts).split("\\|"); - int appLimit = Integer.parseInt(defaultTimeout); - final Map m = new HashMap(); - if(ignoreAppIds != null) { - for (int i = 0; i < ignoreAppIds.length; i++) { - String[] vals = ignoreAppIds[i].split(","); - m.put(vals[0], Integer.parseInt(vals[1])); - } - if (m.get(sot) != null) { - appLimit = m.get(sot); - } - } - return appLimit; - } - - /** - * Returns whether time out is enabled - * @param sot - * @param isEnabled - * @param appTimeouts - * @param defaultTimeout - * @return boolean of whether the timeout is enabled - * @throws AAIException - */ - public boolean isTimeoutEnabled(String sot, String isEnabled, String appTimeouts, String defaultTimeout) throws AAIException{ - Boolean isTimeoutEnabled = Boolean.parseBoolean(isEnabled); - int ata = -1; - if(isTimeoutEnabled) { - ata = getTimeoutLimit(sot, appTimeouts, defaultTimeout); - } - return isTimeoutEnabled && (ata > -1); - } - - /** - * Executes the process thread and watches the future for the timeout - * @param handler - * @param sourceOfTruth - * @param appTimeoutLimit - * @param defaultTimeoutLimit - * @param method - * @param headers - * @param info - * @return the response - */ - - public Response executeProcess(Future handler, String sourceOfTruth, String appTimeoutLimit, String defaultTimeoutLimit, HttpMethod method, HttpHeaders headers, UriInfo info){ - Response response = null; - int timeoutLimit = 0; - try { - timeoutLimit = getTimeoutLimit(sourceOfTruth, appTimeoutLimit, defaultTimeoutLimit); - response = handler.get(timeoutLimit, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - AAIException ex = new AAIException("AAI_7406", String.format("Timeout limit of %s seconds reached.", timeoutLimit/1000)); - response = consumerExceptionResponseGenerator(headers, info, method, ex); - handler.cancel(true); - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, method, ex); - } - return response; - } - - /** - * runner sets up the timer logic and invokes it - * @param toe - * @param tba - * @param tdl - * @param headers - * @param info - * @param httpMethod - * @param c - * @return the response - */ - public Response runner(String toe, String tba, String tdl, HttpHeaders headers, UriInfo info, HttpMethod httpMethod, Callable c){ - Response response = null; - Future handler = null; - ExecutorService executor = null; - try { - String timeoutEnabled = AAIConfig.get(toe); - String timeoutByApp = AAIConfig.get(tba); - String timeoutDefaultLimit = AAIConfig.get(tdl); - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - if (isTimeoutEnabled(sourceOfTruth, timeoutEnabled, timeoutByApp, timeoutDefaultLimit)) { - executor = Executors.newSingleThreadExecutor(); - handler = executor.submit(c); - response = executeProcess(handler, sourceOfTruth, timeoutByApp, timeoutDefaultLimit, httpMethod, headers, info); - } else { - response = (Response) c.call(); - } - }catch(Exception e){ - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, httpMethod, ex); - }finally{ - if(executor != null && handler != null){ - executor.shutdownNow(); - } - } - return response; - } + } -} + protected DBConnectionType determineConnectionType(String fromAppId, String realTime) throws AAIException { + if (fromAppId == null) { + throw new AAIException("AAI_4009", "X-FromAppId is not set"); + } + + DBConnectionType type = DBConnectionType.REALTIME; + boolean isRealTimeClient = AAIConfig.get("aai.realtime.clients", "").contains(fromAppId); + if (isRealTimeClient || realTime != null) { + type = DBConnectionType.REALTIME; + } else { + type = DBConnectionType.CACHED; + } + + return type; + } + + /** + * Gets the input media type. + * + * @param mediaType the media type + * @return the input media type + */ + protected String getInputMediaType(MediaType mediaType) { + String result = mediaType.getType() + "/" + mediaType.getSubtype(); + + return result; + + } + + /** + * Returns the app specific timeout in milliseconds, -1 overrides the timeout for an app + * + * @param sot + * @param appTimeouts + * @param defaultTimeout + * @return integer timeout in or -1 to bypass + * @throws AAIException + */ + + public int getTimeoutLimit(String sot, String appTimeouts, String defaultTimeout) throws AAIException { + String[] ignoreAppIds = (appTimeouts).split("\\|"); + int appLimit = Integer.parseInt(defaultTimeout); + final Map m = new HashMap(); + if (ignoreAppIds != null) { + for (int i = 0; i < ignoreAppIds.length; i++) { + String[] vals = ignoreAppIds[i].split(","); + m.put(vals[0], Integer.parseInt(vals[1])); + } + if (m.get(sot) != null) { + appLimit = m.get(sot); + } + } + return appLimit; + } + /** + * Returns whether time out is enabled + * + * @param sot + * @param isEnabled + * @param appTimeouts + * @param defaultTimeout + * @return boolean of whether the timeout is enabled + * @throws AAIException + */ + public boolean isTimeoutEnabled(String sot, String isEnabled, String appTimeouts, String defaultTimeout) + throws AAIException { + Boolean isTimeoutEnabled = Boolean.parseBoolean(isEnabled); + int ata = -1; + if (isTimeoutEnabled) { + ata = getTimeoutLimit(sot, appTimeouts, defaultTimeout); + } + return isTimeoutEnabled && (ata > -1); + } + + /** + * Executes the process thread and watches the future for the timeout + * + * @param handler + * @param sourceOfTruth + * @param appTimeoutLimit + * @param defaultTimeoutLimit + * @param method + * @param headers + * @param info + * @return the response + */ + + public Response executeProcess(Future handler, String sourceOfTruth, String appTimeoutLimit, + String defaultTimeoutLimit, HttpMethod method, HttpHeaders headers, UriInfo info) { + Response response = null; + int timeoutLimit = 0; + try { + timeoutLimit = getTimeoutLimit(sourceOfTruth, appTimeoutLimit, defaultTimeoutLimit); + response = handler.get(timeoutLimit, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + AAIException ex = new AAIException("AAI_7406", + String.format("Timeout limit of %s seconds reached.", timeoutLimit / 1000)); + response = consumerExceptionResponseGenerator(headers, info, method, ex); + handler.cancel(true); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, method, ex); + } + return response; + } + + /** + * runner sets up the timer logic and invokes it + * + * @param toe + * @param tba + * @param tdl + * @param headers + * @param info + * @param httpMethod + * @param c + * @return the response + */ + public Response runner(String toe, String tba, String tdl, HttpHeaders headers, UriInfo info, HttpMethod httpMethod, + Callable c) { + Response response = null; + Future handler = null; + ExecutorService executor = null; + try { + String timeoutEnabled = AAIConfig.get(toe); + String timeoutByApp = AAIConfig.get(tba); + String timeoutDefaultLimit = AAIConfig.get(tdl); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + if (isTimeoutEnabled(sourceOfTruth, timeoutEnabled, timeoutByApp, timeoutDefaultLimit)) { + executor = Executors.newSingleThreadExecutor(); + handler = executor.submit(c); + response = executeProcess(handler, sourceOfTruth, timeoutByApp, timeoutDefaultLimit, httpMethod, + headers, info); + } else { + response = (Response) c.call(); + } + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, httpMethod, ex); + } finally { + if (executor != null && handler != null) { + executor.shutdownNow(); + } + } + return response; + } + +} diff --git a/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java b/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java index 4703331c..b521a617 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java @@ -17,10 +17,16 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore.search; import groovy.lang.GroovyShell; import groovy.transform.TimedInterrupt; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.expr.ClassExpression; @@ -30,51 +36,44 @@ import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer; import org.codehaus.groovy.control.customizers.ImportCustomizer; import org.onap.aai.serialization.engines.TransactionalGraphEngine; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - public abstract class AAIAbstractGroovyShell { - protected final GroovyShell shell; + protected final GroovyShell shell; - public AAIAbstractGroovyShell() { - Map parameters = new HashMap<>(); - parameters.put("value", 30000); - parameters.put("unit", new PropertyExpression(new ClassExpression(ClassHelper.make(TimeUnit.class)),"MILLISECONDS")); + public AAIAbstractGroovyShell() { + Map parameters = new HashMap<>(); + parameters.put("value", 30000); + parameters.put("unit", + new PropertyExpression(new ClassExpression(ClassHelper.make(TimeUnit.class)), "MILLISECONDS")); - ASTTransformationCustomizer custom = new ASTTransformationCustomizer(parameters, TimedInterrupt.class); - ImportCustomizer imports = new ImportCustomizer(); - imports.addStaticStars( - "org.apache.tinkerpop.gremlin.process.traversal.P", - "org.apache.tinkerpop.gremlin.process.traversal.Order" - ); - imports.addImports( - "org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__", - "org.apache.tinkerpop.gremlin.structure.T", - "org.apache.tinkerpop.gremlin.process.traversal.P", - "org.onap.aai.edges.enums.EdgeType", - "java.util.Map.Entry"); - imports.addStarImports("java.util"); - CompilerConfiguration config = new CompilerConfiguration(); - config.addCompilationCustomizers(custom, imports); + ASTTransformationCustomizer custom = new ASTTransformationCustomizer(parameters, TimedInterrupt.class); + ImportCustomizer imports = new ImportCustomizer(); + imports.addStaticStars("org.apache.tinkerpop.gremlin.process.traversal.P", + "org.apache.tinkerpop.gremlin.process.traversal.Order"); + imports.addImports("org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__", + "org.apache.tinkerpop.gremlin.structure.T", "org.apache.tinkerpop.gremlin.process.traversal.P", + "org.onap.aai.edges.enums.EdgeType", "java.util.Map.Entry"); + imports.addStarImports("java.util"); + CompilerConfiguration config = new CompilerConfiguration(); + config.addCompilationCustomizers(custom, imports); - this.shell = new GroovyShell(config); - } + this.shell = new GroovyShell(config); + } - /** - * - * @param engine - * @param traversal - * @param params - * @return result of graph traversal - */ - public abstract String executeTraversal (TransactionalGraphEngine engine, String traversal, Map params); + /** + * + * @param engine + * @param traversal + * @param params + * @return result of graph traversal + */ + public abstract String executeTraversal(TransactionalGraphEngine engine, String traversal, + Map params); - /** - * @param traversal - * @param params - * @return result of graph traversal - */ - public abstract GraphTraversal executeTraversal (String traversal, Map params); + /** + * @param traversal + * @param params + * @return result of graph traversal + */ + public abstract GraphTraversal executeTraversal(String traversal, Map params); } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/search/GremlinGroovyShell.java b/aai-core/src/main/java/org/onap/aai/restcore/search/GremlinGroovyShell.java index 1d074dd4..2b39af43 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/search/GremlinGroovyShell.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/search/GremlinGroovyShell.java @@ -17,15 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore.search; import groovy.lang.Binding; import groovy.lang.Script; -import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; -import org.onap.aai.serialization.engines.TransactionalGraphEngine; import java.util.Map; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; +import org.onap.aai.serialization.engines.TransactionalGraphEngine; + /** * Creates and returns a groovy shell with the * configuration to statically import graph classes @@ -33,26 +35,26 @@ import java.util.Map; */ public class GremlinGroovyShell extends AAIAbstractGroovyShell { - public GremlinGroovyShell() { - super(); - } - - /** - * {@inheritDoc} - */ - @Override - public GraphTraversal executeTraversal (String traversal, Map params) { - Binding binding = new Binding(params); - Script script = shell.parse(traversal); - script.setBinding(binding); - return (GraphTraversal) script.run(); - } - - /** - * @throws UnsupportedOperationException - */ - @Override - public String executeTraversal(TransactionalGraphEngine engine, String traversal, Map params) { - throw new UnsupportedOperationException(); - } + public GremlinGroovyShell() { + super(); + } + + /** + * {@inheritDoc} + */ + @Override + public GraphTraversal executeTraversal(String traversal, Map params) { + Binding binding = new Binding(params); + Script script = shell.parse(traversal); + script.setBinding(binding); + return (GraphTraversal) script.run(); + } + + /** + * @throws UnsupportedOperationException + */ + @Override + public String executeTraversal(TransactionalGraphEngine engine, String traversal, Map params) { + throw new UnsupportedOperationException(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/search/GroovyQueryBuilder.java b/aai-core/src/main/java/org/onap/aai/restcore/search/GroovyQueryBuilder.java index f5ec19d5..ba6acb66 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/search/GroovyQueryBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/search/GroovyQueryBuilder.java @@ -17,10 +17,14 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore.search; import groovy.lang.Binding; import groovy.lang.Script; + +import java.util.Map; + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.config.SpringContextAware; @@ -32,8 +36,6 @@ import org.onap.aai.serialization.engines.QueryStyle; import org.onap.aai.serialization.engines.TransactionalGraphEngine; import org.onap.aai.setup.SchemaVersions; -import java.util.Map; - /** * Creates and returns a groovy shell with the * configuration to statically import graph classes @@ -41,34 +43,35 @@ import java.util.Map; */ public class GroovyQueryBuilder extends AAIAbstractGroovyShell { - public GroovyQueryBuilder() { - super(); - } + public GroovyQueryBuilder() { + super(); + } - /** - * {@inheritDoc} - */ - @Override - public String executeTraversal (TransactionalGraphEngine engine, String traversal, Map params) { - QueryBuilder builder = engine.getQueryBuilder(QueryStyle.GREMLIN_TRAVERSAL); - SchemaVersions schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions"); - Loader loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion()); + /** + * {@inheritDoc} + */ + @Override + public String executeTraversal(TransactionalGraphEngine engine, String traversal, Map params) { + QueryBuilder builder = engine.getQueryBuilder(QueryStyle.GREMLIN_TRAVERSAL); + SchemaVersions schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions"); + Loader loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, + schemaVersions.getDefaultVersion()); - builder.changeLoader(loader); - Binding binding = new Binding(params); - binding.setVariable("builder", builder); - Script script = shell.parse(traversal); - script.setBinding(binding); - script.run(); + builder.changeLoader(loader); + Binding binding = new Binding(params); + binding.setVariable("builder", builder); + Script script = shell.parse(traversal); + script.setBinding(binding); + script.run(); - return builder.getQuery(); - } + return builder.getQuery(); + } - /** - * @throws UnsupportedOperationException - */ - @Override - public GraphTraversal executeTraversal(String traversal, Map params) { - throw new UnsupportedOperationException(); - } + /** + * @throws UnsupportedOperationException + */ + @Override + public GraphTraversal executeTraversal(String traversal, Map params) { + throw new UnsupportedOperationException(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/restcore/util/URITools.java b/aai-core/src/main/java/org/onap/aai/restcore/util/URITools.java index c12c080b..a757d3db 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/util/URITools.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/util/URITools.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.restcore.util; import java.io.UnsupportedEncodingException; @@ -33,83 +34,85 @@ import java.util.regex.Pattern; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; -import org.springframework.web.util.UriUtils; - import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.sideeffect.exceptions.AAIMissingRequiredPropertyException; import org.onap.aai.schema.enums.PropertyMetadata; +import org.springframework.web.util.UriUtils; public class URITools { - protected static final Pattern template = Pattern.compile("\\{(.*?)\\}"); + protected static final Pattern template = Pattern.compile("\\{(.*?)\\}"); + + public static MultivaluedMap getQueryMap(URI uri) { + MultivaluedMap result = new MultivaluedHashMap<>(); + String queryParams = uri.getRawQuery(); + if (queryParams != null) { + try { + String[] sections = queryParams.split("&"); + String[] query = null; + String key, value = ""; + for (String section : sections) { + query = section.split("="); + key = UriUtils.decode(query[0], "UTF-8"); + if (query[1] != null) { + query[1] = query[1].replaceAll("\\+", "%20"); + } + value = UriUtils.decode(query[1], "UTF-8"); + if (result.containsKey(key)) { + result.add(key, value); + } else { + result.putSingle(key, value); + } + } + } catch (UnsupportedEncodingException e) { + + } + } + return result; + + } + + public static Optional replaceTemplates(Introspector obj, String uriString, PropertyMetadata metadata, + boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { + String result = uriString; + final Map propMap = URITools.findProperties(obj, uriString, metadata, replaceWithWildcard); + if (propMap.isEmpty()) { + return Optional.empty(); + } + for (Entry entry : propMap.entrySet()) { + result = result.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue()); + } + // drop out wildcards if they exist + result = result.replaceFirst("/[^/]+?(?:/\\*)+", ""); + return Optional.of(result); + } + + private static Map findProperties(Introspector obj, String uriString, PropertyMetadata metadata, + boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { + + final Map result = new HashMap<>(); + final Set missing = new LinkedHashSet<>(); + Matcher m = template.matcher(uriString); + int properties = 0; + while (m.find()) { + String propName = m.group(1); + String value = obj.getValue(propName); + properties++; + if (value != null) { + result.put(propName, value); + } else { + if (replaceWithWildcard) { + result.put(propName, "*"); + } + missing.add(propName); + } + } + + if (!missing.isEmpty() && (properties != missing.size())) { + throw new AAIMissingRequiredPropertyException( + "Cannot complete " + metadata.toString() + " uri. Missing properties " + missing); + } + return result; + } - public static MultivaluedMap getQueryMap(URI uri) { - MultivaluedMap result = new MultivaluedHashMap<>(); - String queryParams = uri.getRawQuery(); - if (queryParams != null) { - try { - String[] sections = queryParams.split("&"); - String[] query = null; - String key, value = ""; - for (String section : sections) { - query = section.split("="); - key = UriUtils.decode(query[0], "UTF-8"); - if(query[1] != null){ - query[1] = query[1].replaceAll("\\+", "%20"); - } - value = UriUtils.decode(query[1], "UTF-8"); - if (result.containsKey(key)) { - result.add(key, value); - } else { - result.putSingle(key, value); - } - } - } catch (UnsupportedEncodingException e ) { - - } - } - return result; - - } - - public static Optional replaceTemplates(Introspector obj, String uriString, PropertyMetadata metadata, boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { - String result = uriString; - final Map propMap = URITools.findProperties(obj, uriString, metadata, replaceWithWildcard); - if (propMap.isEmpty()) { - return Optional.empty(); - } - for (Entry entry : propMap.entrySet()) { - result = result.replaceAll("\\{" + entry.getKey() + "\\}", entry.getValue()); - } - //drop out wildcards if they exist - result = result.replaceFirst("/[^/]+?(?:/\\*)+", ""); - return Optional.of(result); - } - - private static Map findProperties(Introspector obj, String uriString, PropertyMetadata metadata, boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { - - final Map result = new HashMap<>(); - final Set missing = new LinkedHashSet<>(); - Matcher m = template.matcher(uriString); - int properties = 0; - while (m.find()) { - String propName = m.group(1); - String value = obj.getValue(propName); - properties++; - if (value != null) { - result.put(propName, value); - } else { - if (replaceWithWildcard) { - result.put(propName, "*"); - } - missing.add(propName); - } - } - - if (!missing.isEmpty() && (properties != missing.size())) { - throw new AAIMissingRequiredPropertyException("Cannot complete " + metadata.toString() + " uri. Missing properties " + missing); - } - return result; - } - } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/DBSerializer.java b/aai-core/src/main/java/org/onap/aai/serialization/db/DBSerializer.java index 7a941c69..3996c07d 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/DBSerializer.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/DBSerializer.java @@ -17,12 +17,28 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.serialization.db; +package org.onap.aai.serialization.db; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.google.common.base.CaseFormat; + +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.ws.rs.core.UriBuilder; + import org.apache.commons.collections.IteratorUtils; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; @@ -70,20 +86,6 @@ import org.onap.aai.util.AAIConstants; import org.onap.aai.workarounds.NamingExceptions; import org.springframework.context.ApplicationContext; -import javax.ws.rs.core.UriBuilder; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Array; -import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class DBSerializer { private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(DBSerializer.class); @@ -106,6 +108,7 @@ public class DBSerializer { private SchemaVersions schemaVersions; private Set namedPropNodes; + /** * Instantiates a new DB serializer. * @@ -115,15 +118,18 @@ public class DBSerializer { * @param sourceOfTruth the source of truth * @throws AAIException */ - public DBSerializer(SchemaVersion version, TransactionalGraphEngine engine, ModelType introspectionType, String sourceOfTruth) throws AAIException { + public DBSerializer(SchemaVersion version, TransactionalGraphEngine engine, ModelType introspectionType, + String sourceOfTruth) throws AAIException { this.engine = engine; this.sourceOfTruth = sourceOfTruth; this.introspectionType = introspectionType; this.schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions"); SchemaVersion LATEST = schemaVersions.getDefaultVersion(); - this.latestLoader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(introspectionType, LATEST); + this.latestLoader = + SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(introspectionType, LATEST); this.version = version; - this.loader = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(introspectionType, version); + this.loader = + SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(introspectionType, version); this.namedPropNodes = this.latestLoader.getNamedPropNodes(); this.baseURL = AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE); this.currentTimeMillis = System.currentTimeMillis(); @@ -131,7 +137,7 @@ public class DBSerializer { } private void initBeans() { - //TODO proper spring wiring, but that requires a lot of refactoring so for now we have this + // TODO proper spring wiring, but that requires a lot of refactoring so for now we have this ApplicationContext ctx = SpringContextAware.getApplicationContext(); EdgeIngestor ei = ctx.getBean(EdgeIngestor.class); setEdgeIngestor(ei); @@ -186,14 +192,13 @@ public class DBSerializer { } - /** * Creates the new vertex. * * @param wrappedObject the wrapped object * @return the vertex * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception */ public Vertex createNewVertex(Introspector wrappedObject) { Vertex v; @@ -230,33 +235,35 @@ public class DBSerializer { /** * Serialize to db. * - * @param obj the obj - * @param v the v - * @param uriQuery the uri query + * @param obj the obj + * @param v the v + * @param uriQuery the uri query * @param identifier the identifier - * @throws SecurityException the security exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws InstantiationException the instantiation exception - * @throws InterruptedException the interrupted exception - * @throws NoSuchMethodException the no such method exception - * @throws AAIException the AAI exception + * @throws SecurityException the security exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws InstantiationException the instantiation exception + * @throws InterruptedException the interrupted exception + * @throws NoSuchMethodException the no such method exception + * @throws AAIException the AAI exception * @throws UnsupportedEncodingException the unsupported encoding exception * @throws AAIUnknownObjectException */ - public void serializeToDb(Introspector obj, Vertex v, QueryParser uriQuery, String identifier, String requestContext) throws AAIException, UnsupportedEncodingException { + public void serializeToDb(Introspector obj, Vertex v, QueryParser uriQuery, String identifier, + String requestContext) throws AAIException, UnsupportedEncodingException { StopWatch.conditionalStart(); try { if (uriQuery.isDependent()) { - //try to find the parent + // try to find the parent List vertices = uriQuery.getQueryBuilder().getParentQuery().toList(); if (!vertices.isEmpty()) { Vertex parent = vertices.get(0); this.reflectDependentVertex(parent, v, obj, requestContext); } else { dbTimeMsecs += StopWatch.stopIfStarted(); - throw new AAIException("AAI_6114", "No parent Node of type " + uriQuery.getParentResultType() + " for " + identifier); + throw new AAIException("AAI_6114", + "No parent Node of type " + uriQuery.getParentResultType() + " for " + identifier); } } else { serializeSingleVertex(v, obj, requestContext); @@ -269,7 +276,8 @@ public class DBSerializer { dbTimeMsecs += StopWatch.stopIfStarted(); } - public void serializeSingleVertex(Vertex v, Introspector obj, String requestContext) throws UnsupportedEncodingException, AAIException { + public void serializeSingleVertex(Vertex v, Introspector obj, String requestContext) + throws UnsupportedEncodingException, AAIException { StopWatch.conditionalStart(); try { boolean isTopLevel = obj.isTopLevel(); @@ -304,15 +312,15 @@ public class DBSerializer { * * @param the generic type * @param obj the obj - * @param v the v + * @param v the v * @return the list - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws InstantiationException the instantiation exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception - * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception + * @throws AAIException the AAI exception * @throws UnsupportedEncodingException the unsupported encoding exception * @throws AAIUnknownObjectException */ @@ -320,7 +328,8 @@ public class DBSerializer { * Helper method for reflectToDb * Handles all the property setting */ - private List processObject(Introspector obj, Vertex v, String requestContext) throws UnsupportedEncodingException, AAIException { + private List processObject(Introspector obj, Vertex v, String requestContext) + throws UnsupportedEncodingException, AAIException { Set properties = new LinkedHashSet<>(obj.getProperties()); properties.remove(AAIProperties.RESOURCE_VERSION); List dependentVertexes = new ArrayList<>(); @@ -349,8 +358,8 @@ public class DBSerializer { dbProperty = metadata.get(PropertyMetadata.DB_ALIAS); } if (metadata.containsKey(PropertyMetadata.DATA_LINK)) { - //data linked properties are ephemeral - //they are populated dynamically on GETs + // data linked properties are ephemeral + // they are populated dynamically on GETs continue; } if (value != null) { @@ -376,12 +385,14 @@ public class DBSerializer { } } } else { - //simple list case + // simple list case engine.setListProperty(v, property, list); } } else { - //method.getReturnType() is not 'simple' then create a vertex and edge recursively returning an edge back to this method - if (value != null) { //effectively ignore complex properties not included in the object we're processing + // method.getReturnType() is not 'simple' then create a vertex and edge recursively returning an edge + // back to this method + if (value != null) { // effectively ignore complex properties not included in the object we're + // processing if (value.getClass().isArray()) { int length = Array.getLength(value); @@ -396,13 +407,15 @@ public class DBSerializer { // container case Introspector introspector = IntrospectorFactory.newInstance(this.introspectionType, value); if (introspector.isContainer()) { - dependentVertexes.addAll(this.engine.getQueryEngine().findChildrenOfType(v, introspector.getChildDBName())); + dependentVertexes.addAll( + this.engine.getQueryEngine().findChildrenOfType(v, introspector.getChildDBName())); introspector.setURIChain(obj.getURI()); processedVertexes.addAll(processObject(introspector, v, requestContext)); } else { - dependentVertexes.addAll(this.engine.getQueryEngine().findChildrenOfType(v, introspector.getDbName())); + dependentVertexes.addAll( + this.engine.getQueryEngine().findChildrenOfType(v, introspector.getDbName())); processedVertexes.add(reflectDependentVertex(v, introspector, requestContext)); } @@ -424,7 +437,7 @@ public class DBSerializer { // is doing this so the SE can work with the clients making the call to // tell them not to call this API and can hopefully deprecate this // functionality in the future releases - if(!dependentVertexes.isEmpty()){ + if (!dependentVertexes.isEmpty()) { LoggingContext.responseDescription(IMPLICIT_DELETE); @@ -435,32 +448,31 @@ public class DBSerializer { int impliedDeleteCount = impliedDeleteVertices.size(); LOGGER.warn( - "For the vertex with id {}, doing an implicit delete on update will delete total of {} vertexes", - v.id(), - impliedDeleteCount - ); + "For the vertex with id {}, doing an implicit delete on update will delete total of {} vertexes", + v.id(), impliedDeleteCount); String impliedDeleteLogEnabled = AAIConfig.get(AAIConstants.AAI_IMPLIED_DELETE_LOG_ENABLED, "true"); int impliedDeleteLogLimit = AAIConfig.getInt(AAIConstants.AAI_IMPLIED_DELETE_LOG_LIMIT, "-1"); - if(impliedDeleteLogLimit == -1){ + if (impliedDeleteLogLimit == -1) { impliedDeleteLogLimit = Integer.MAX_VALUE; } // If the logging is enabled for implied delete // then log the payload in the latest format - if("true".equals(impliedDeleteLogEnabled) && - impliedDeleteCount <= impliedDeleteLogLimit){ - for(Vertex vertex : impliedDeleteVertices){ + if ("true".equals(impliedDeleteLogEnabled) && impliedDeleteCount <= impliedDeleteLogLimit) { + for (Vertex vertex : impliedDeleteVertices) { Introspector introspector = null; try { introspector = getLatestVersionView(vertex); - if(LOGGER.isInfoEnabled()){ + if (LOGGER.isInfoEnabled()) { LOGGER.info("Implied delete object in json format {}", introspector.marshal(false)); } - } catch(Exception ex){ - LOGGER.warn("Encountered an exception during retrieval of vertex properties with vertex-id {} -> {}", v.id(), LogFormatTools.getStackTop(ex)); + } catch (Exception ex) { + LOGGER.warn( + "Encountered an exception during retrieval of vertex properties with vertex-id {} -> {}", + v.id(), LogFormatTools.getStackTop(ex)); } } } @@ -476,37 +488,36 @@ public class DBSerializer { /** * Handle relationships. * - * @param obj the obj + * @param obj the obj * @param vertex the vertex - * @throws SecurityException the security exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception + * @throws SecurityException the security exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception */ /* * Handles the explicit relationships defined for an obj */ - private void handleRelationships(Introspector obj, Vertex vertex) throws UnsupportedEncodingException, AAIException { - + private void handleRelationships(Introspector obj, Vertex vertex) + throws UnsupportedEncodingException, AAIException { Introspector wrappedRl = obj.getWrappedValue("relationship-list"); processRelationshipList(wrappedRl, vertex); - } - /** * Process relationship list. * * @param wrapped the wrapped - * @param v the v + * @param v the v * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception */ - private void processRelationshipList(Introspector wrapped, Vertex v) throws UnsupportedEncodingException, AAIException { + private void processRelationshipList(Introspector wrapped, Vertex v) + throws UnsupportedEncodingException, AAIException { List relationships = (List) wrapped.getValue("relationship"); @@ -526,12 +537,13 @@ public class DBSerializer { List results = parser.getQueryBuilder().toList(); if (results.isEmpty()) { - final AAIException ex = new AAIException("AAI_6129", "Node of type " + parser.getResultType() + ". Could not find object at: " + parser.getUri()); + final AAIException ex = new AAIException("AAI_6129", + "Node of type " + parser.getResultType() + ". Could not find object at: " + parser.getUri()); ex.getTemplateVars().add(parser.getResultType()); ex.getTemplateVars().add(parser.getUri().toString()); throw ex; } else { - //still an issue if there's more than one + // still an issue if there's more than one cousinVertex = results.get(0); } @@ -540,11 +552,14 @@ public class DBSerializer { String cousinType = (String) cousinVertex.property(AAIProperties.NODE_TYPE).value(); EdgeRuleQuery.Builder baseQ = new EdgeRuleQuery.Builder(vType, cousinType).label(label); - if (!edgeRules.hasRule(baseQ.build())) { - throw new AAIException("AAI_6120", "No EdgeRule found for passed nodeTypes: " + v.property(AAIProperties.NODE_TYPE).value().toString() + ", " - + cousinVertex.property(AAIProperties.NODE_TYPE).value().toString() + (label != null ? (" with label " + label) : "") + "."); - } else if (edgeRules.hasRule(baseQ.edgeType(EdgeType.TREE).build()) && !edgeRules.hasRule(baseQ.edgeType(EdgeType.COUSIN).build())) { + throw new AAIException("AAI_6120", + "No EdgeRule found for passed nodeTypes: " + + v.property(AAIProperties.NODE_TYPE).value().toString() + ", " + + cousinVertex.property(AAIProperties.NODE_TYPE).value().toString() + + (label != null ? (" with label " + label) : "") + "."); + } else if (edgeRules.hasRule(baseQ.edgeType(EdgeType.TREE).build()) + && !edgeRules.hasRule(baseQ.edgeType(EdgeType.COUSIN).build())) { throw new AAIException("AAI_6145"); } @@ -563,7 +578,8 @@ public class DBSerializer { } for (Triplet triplet : addEdges) { try { - edgeSer.addEdge(this.engine.asAdmin().getTraversalSource(), triplet.getValue0(), triplet.getValue1(), triplet.getValue2()); + edgeSer.addEdge(this.engine.asAdmin().getTraversalSource(), triplet.getValue0(), triplet.getValue1(), + triplet.getValue2()); } catch (NoEdgeRuleFoundException e) { throw new AAIException("AAI_6129", e); } @@ -574,7 +590,7 @@ public class DBSerializer { /** * Write through defaults. * - * @param v the v + * @param v the v * @param obj the obj * @throws AAIUnknownObjectException */ @@ -598,27 +614,27 @@ public class DBSerializer { } - /** * Reflect dependent vertex. * - * @param v the v + * @param v the v * @param dependentObj the dependent obj * @return the vertex - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws InstantiationException the instantiation exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception - * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception + * @throws AAIException the AAI exception * @throws UnsupportedEncodingException the unsupported encoding exception * @throws AAIUnknownObjectException */ - private Vertex reflectDependentVertex(Vertex v, Introspector dependentObj, String requestContext) throws AAIException, UnsupportedEncodingException { + private Vertex reflectDependentVertex(Vertex v, Introspector dependentObj, String requestContext) + throws AAIException, UnsupportedEncodingException { - //QueryParser p = this.engine.getQueryBuilder().createQueryFromURI(obj.getURI()); - //List items = p.getQuery().toList(); + // QueryParser p = this.engine.getQueryBuilder().createQueryFromURI(obj.getURI()); + // List items = p.getQuery().toList(); QueryBuilder query = this.engine.getQueryBuilder(v); query.createEdgeTraversal(EdgeType.TREE, v, dependentObj); query.createKeyQuery(dependentObj); @@ -628,9 +644,12 @@ public class DBSerializer { Vertex dependentVertex = null; if (items.size() == 1) { dependentVertex = items.get(0); - this.verifyResourceVersion("update", dependentObj.getDbName(), dependentVertex.property(AAIProperties.RESOURCE_VERSION).orElse(null), (String) dependentObj.getValue(AAIProperties.RESOURCE_VERSION), (String) dependentObj.getURI()); + this.verifyResourceVersion("update", dependentObj.getDbName(), + dependentVertex.property(AAIProperties.RESOURCE_VERSION).orElse(null), + (String) dependentObj.getValue(AAIProperties.RESOURCE_VERSION), (String) dependentObj.getURI()); } else { - this.verifyResourceVersion("create", dependentObj.getDbName(), "", (String) dependentObj.getValue(AAIProperties.RESOURCE_VERSION), (String) dependentObj.getURI()); + this.verifyResourceVersion("create", dependentObj.getDbName(), "", + (String) dependentObj.getValue(AAIProperties.RESOURCE_VERSION), (String) dependentObj.getURI()); dependentVertex = createNewVertex(dependentObj); } @@ -642,20 +661,21 @@ public class DBSerializer { * Reflect dependent vertex. * * @param parent the parent - * @param child the child - * @param obj the obj + * @param child the child + * @param obj the obj * @return the vertex - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws InstantiationException the instantiation exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception - * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception + * @throws AAIException the AAI exception * @throws UnsupportedEncodingException the unsupported encoding exception * @throws AAIUnknownObjectException */ - private Vertex reflectDependentVertex(Vertex parent, Vertex child, Introspector obj, String requestContext) throws AAIException, UnsupportedEncodingException { + private Vertex reflectDependentVertex(Vertex parent, Vertex child, Introspector obj, String requestContext) + throws AAIException, UnsupportedEncodingException { String parentUri = parent.property(AAIProperties.AAI_URI).orElse(null); if (parentUri != null) { @@ -671,8 +691,10 @@ public class DBSerializer { if (e == null) { String canBeLinked = obj.getMetadata(ObjectMetadata.CAN_BE_LINKED); if (canBeLinked != null && canBeLinked.equals("true")) { - Loader ldrForCntxt = SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(introspectionType, getVerForContext(requestContext)); - boolean isFirst = !this.engine.getQueryBuilder(ldrForCntxt, parent).createEdgeTraversal(EdgeType.TREE, parent, obj).hasNext(); + Loader ldrForCntxt = SpringContextAware.getBean(LoaderFactory.class) + .createLoaderForVersion(introspectionType, getVerForContext(requestContext)); + boolean isFirst = !this.engine.getQueryBuilder(ldrForCntxt, parent) + .createEdgeTraversal(EdgeType.TREE, parent, obj).hasNext(); if (isFirst) { child.property(AAIProperties.LINKED, true); } @@ -697,23 +719,24 @@ public class DBSerializer { * Db to object. * * @param vertices the vertices - * @param obj the obj - * @param depth the depth - * @param cleanUp the clean up + * @param obj the obj + * @param depth the depth + * @param cleanUp the clean up * @return the introspector - * @throws AAIException the AAI exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws SecurityException the security exception - * @throws InstantiationException the instantiation exception - * @throws NoSuchMethodException the no such method exception + * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws MalformedURLException the malformed URL exception + * @throws MalformedURLException the malformed URL exception * @throws AAIUnknownObjectException * @throws URISyntaxException */ - public Introspector dbToObject(List vertices, final Introspector obj, int depth, boolean nodeOnly, String cleanUp) throws UnsupportedEncodingException, AAIException { + public Introspector dbToObject(List vertices, final Introspector obj, int depth, boolean nodeOnly, + String cleanUp) throws UnsupportedEncodingException, AAIException { final int internalDepth; if (depth == Integer.MAX_VALUE) { internalDepth = depth--; @@ -723,7 +746,8 @@ public class DBSerializer { StopWatch.conditionalStart(); if (vertices.size() > 1 && !obj.isContainer()) { dbTimeMsecs += StopWatch.stopIfStarted(); - throw new AAIException("AAI_6136", "query object mismatch: this object cannot hold multiple items." + obj.getDbName()); + throw new AAIException("AAI_6136", + "query object mismatch: this object cannot hold multiple items." + obj.getDbName()); } else if (obj.isContainer()) { final List getList; String listProperty = null; @@ -736,7 +760,8 @@ public class DBSerializer { final String propertyName = listProperty; getList = (List) obj.getValue(listProperty); - /* This is an experimental multithreading experiment + /* + * This is an experimental multithreading experiment * on get alls. */ ExecutorService pool = GetAllPool.getInstance().getPool(); @@ -764,7 +789,7 @@ public class DBSerializer { throw e; } return childObject.getUnderlyingObject(); - //getList.add(childObject.getUnderlyingObject()); + // getList.add(childObject.getUnderlyingObject()); } }; futures.add(pool.submit(task)); @@ -785,7 +810,7 @@ public class DBSerializer { Set seen = new HashSet<>(); dbToObject(obj, vertices.get(0), seen, depth, nodeOnly, cleanUp); } else { - //obj = null; + // obj = null; } dbTimeMsecs += StopWatch.stopIfStarted(); @@ -795,25 +820,26 @@ public class DBSerializer { /** * Db to object. * - * @param obj the obj - * @param v the v - * @param seen the seen - * @param depth the depth + * @param obj the obj + * @param v the v + * @param seen the seen + * @param depth the depth * @param cleanUp the clean up * @return the introspector - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws SecurityException the security exception - * @throws InstantiationException the instantiation exception - * @throws NoSuchMethodException the no such method exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception - * @throws MalformedURLException the malformed URL exception + * @throws AAIException the AAI exception + * @throws MalformedURLException the malformed URL exception * @throws AAIUnknownObjectException * @throws URISyntaxException */ - private Introspector dbToObject(Introspector obj, Vertex v, Set seen, int depth, boolean nodeOnly, String cleanUp) throws AAIException, UnsupportedEncodingException { + private Introspector dbToObject(Introspector obj, Vertex v, Set seen, int depth, boolean nodeOnly, + String cleanUp) throws AAIException, UnsupportedEncodingException { if (depth < 0) { return null; @@ -863,14 +889,16 @@ public class DBSerializer { EdgeRule rule; try { - rule = edgeRules.getRule(new EdgeRuleQuery.Builder(vType, childDbName).edgeType(EdgeType.TREE).build()); + rule = edgeRules.getRule( + new EdgeRuleQuery.Builder(vType, childDbName).edgeType(EdgeType.TREE).build()); } catch (EdgeRuleNotFoundException e) { throw new NoEdgeRuleFoundException(e); } catch (AmbiguousRuleChoiceException e) { throw new MultipleEdgeRuleFoundException(e); } if (!rule.getContains().equals(AAIDirection.NONE.toString())) { - //vertices = this.queryEngine.findRelatedVertices(v, Direction.OUT, rule.getLabel(), childDbName); + // vertices = this.queryEngine.findRelatedVertices(v, Direction.OUT, rule.getLabel(), + // childDbName); Direction ruleDirection = rule.getDirection(); Iterator itr = v.vertices(ruleDirection, rule.getLabel()); List verticesList = (List) IteratorUtils.toList(itr); @@ -887,7 +915,8 @@ public class DBSerializer { if (!seen.contains(childVertex)) { Introspector argumentObject = obj.newIntrospectorInstanceOfNestedProperty(property); - Object result = dbToObject(argumentObject, childVertex, seen, depth, nodeOnly, cleanUp); + Object result = + dbToObject(argumentObject, childVertex, seen, depth, nodeOnly, cleanUp); if (result != null) { getList.add(argumentObject.getUnderlyingObject()); } @@ -895,11 +924,12 @@ public class DBSerializer { processed++; } else { removed++; - LOGGER.warn("Cycle found while serializing vertex id={}", childVertex.id().toString()); + LOGGER.warn("Cycle found while serializing vertex id={}", + childVertex.id().toString()); } } if (processed == 0) { - //vertices were all seen, reset the list + // vertices were all seen, reset the list getList = null; } if (processed > 0) { @@ -921,7 +951,7 @@ public class DBSerializer { } } - //no changes were made to this obj, discard the instance + // no changes were made to this obj, discard the instance if (!modified) { return null; } @@ -930,7 +960,6 @@ public class DBSerializer { } - public Introspector getVertexProperties(Vertex v) throws AAIException, UnsupportedEncodingException { String nodeType = v.property(AAIProperties.NODE_TYPE).orElse(null); if (nodeType == null) { @@ -969,14 +998,14 @@ public class DBSerializer { * Copy simple property. * * @param property the property - * @param obj the obj - * @param v the v - * @throws InstantiationException the instantiation exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception + * @param obj the obj + * @param v the v + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception */ private void copySimpleProperty(String property, Introspector obj, Vertex v) { final Object temp = getProperty(obj, property, v); @@ -985,15 +1014,14 @@ public class DBSerializer { } } - /** * Load the introspector from the hashmap for the given property key * * @param property - vertex property - * @param obj - introspector object representing the vertex - * @param hashMap - Containing a list of pre-fetched properties for a given vertex + * @param obj - introspector object representing the vertex + * @param hashMap - Containing a list of pre-fetched properties for a given vertex */ - private void copySimplePropertyFromHashMap(String property, Introspector obj, Map hashMap){ + private void copySimplePropertyFromHashMap(String property, Introspector obj, Map hashMap) { final Map metadata = obj.getPropertyMetadata(property); String dbPropertyName = property; @@ -1013,28 +1041,27 @@ public class DBSerializer { * Simple db to object. * * @param obj the obj - * @param v the v - * @throws InstantiationException the instantiation exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception + * @param v the v + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception */ private void simpleDbToObject(Introspector obj, Vertex v) { - for(String key : obj.getProperties()){ + for (String key : obj.getProperties()) { this.copySimpleProperty(key, obj, v); } } - - public Map convertVertexToHashMap(Introspector obj, Vertex v){ + public Map convertVertexToHashMap(Introspector obj, Vertex v) { long startTime = System.currentTimeMillis(); Set simpleProperties = obj.getSimpleProperties(PropertyPredicates.isVisible()); - String[] simplePropsArray = new String[simpleProperties.size()]; - simplePropsArray = simpleProperties.toArray(simplePropsArray); + String[] simplePropsArray = new String[simpleProperties.size()]; + simplePropsArray = simpleProperties.toArray(simplePropsArray); Map simplePropsHashMap = new HashMap<>(simplePropsArray.length * 2); @@ -1045,39 +1072,42 @@ public class DBSerializer { public Introspector dbToRelationshipObject(Vertex v) throws UnsupportedEncodingException, AAIException { Introspector relationshipList = this.latestLoader.introspectorFromName("relationship-list"); - relationshipList = createRelationshipList(v, relationshipList, "false"); + relationshipList = createRelationshipList(v, relationshipList, "false"); return relationshipList; } + /** * Creates the relationship list. * - * @param v the v - * @param obj the obj + * @param v the v + * @param obj the obj * @param cleanUp the clean up * @return the object - * @throws InstantiationException the instantiation exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception - * @throws MalformedURLException the malformed URL exception + * @throws AAIException the AAI exception + * @throws MalformedURLException the malformed URL exception * @throws URISyntaxException */ - private Introspector createRelationshipList(Vertex v, Introspector obj, String cleanUp) throws UnsupportedEncodingException, AAIException { + private Introspector createRelationshipList(Vertex v, Introspector obj, String cleanUp) + throws UnsupportedEncodingException, AAIException { String[] cousinRules = new String[0]; try { cousinRules = edgeRules.retrieveCachedCousinLabels(obj.getDbName()); } catch (ExecutionException e) { - LOGGER.warn("Encountered an execution exception while retrieving labels for the node type {} using cached", obj.getDbName(), e); + LOGGER.warn("Encountered an execution exception while retrieving labels for the node type {} using cached", + obj.getDbName(), e); } List cousins = null; - if(cousinRules != null && cousinRules.length != 0){ + if (cousinRules != null && cousinRules.length != 0) { cousins = this.engine.getQueryEngine().findCousinVertices(v, cousinRules); } else { cousins = this.engine.getQueryEngine().findCousinVertices(v); @@ -1086,7 +1116,7 @@ public class DBSerializer { List relationshipObjList = obj.getValue("relationship"); VertexProperty nodeTypeProperty = v.property(AAIProperties.NODE_TYPE); - if(!nodeTypeProperty.isPresent()){ + if (!nodeTypeProperty.isPresent()) { LoggingContext.responseDescription(MISSING_REQUIRED_NODE_PROPERTY); LOGGER.warn("Not processing the vertex {} because its missing required property aai-node-type", v.id()); LoggingContext.remove(LoggingContext.LoggingField.RESPONSE_DESCRIPTION.toString()); @@ -1115,14 +1145,14 @@ public class DBSerializer { for (Vertex cousin : cousins) { VertexProperty vertexProperty = cousin.property(AAIProperties.NODE_TYPE); String bNodeType = null; - if(vertexProperty.isPresent()){ + if (vertexProperty.isPresent()) { bNodeType = cousin.property(AAIProperties.NODE_TYPE).value().toString(); } else { // If the vertex is missing the aai-node-type // Then its either a bad vertex or its in the process // of getting deleted so we should ignore these vertexes LoggingContext.responseDescription(MISSING_REQUIRED_NODE_PROPERTY); - if(LOGGER.isDebugEnabled()){ + if (LOGGER.isDebugEnabled()) { LOGGER.debug("For the vertex {}, unable to retrieve the aai-node-type", v.id().toString()); } else { LOGGER.info("Unable to retrieve the aai-node-type for vertex, for more info enable debug log"); @@ -1132,9 +1162,9 @@ public class DBSerializer { } if (obj.getVersion().compareTo(schemaVersions.getEdgeLabelVersion()) >= 0) { String edgeKey = alphabetizer.buildAlphabetizedKey(aNodeType, bNodeType); - if(keysWithMultipleLabels.contains(edgeKey)){ + if (keysWithMultipleLabels.contains(edgeKey)) { List edgeLabels = this.getEdgeLabelsBetween(EdgeType.COUSIN, v, cousin); - for(String edgeLabel: edgeLabels){ + for (String edgeLabel : edgeLabels) { Introspector relationshipObj = obj.newIntrospectorInstanceOfNestedProperty("relationship"); Object result = processEdgeRelationship(relationshipObj, cousin, cleanUp, edgeLabel); if (result != null) { @@ -1154,27 +1184,25 @@ public class DBSerializer { // only for the older apis and the new apis if the edge rule // is removed will not be seen in the newer version of the API - EdgeRuleQuery ruleQuery = queryBuilder - .to(bNodeType) - .edgeType(EdgeType.COUSIN) - .version(obj.getVersion()) - .build(); + EdgeRuleQuery ruleQuery = + queryBuilder.to(bNodeType).edgeType(EdgeType.COUSIN).version(obj.getVersion()).build(); try { edgeRule = edgeIngestor.getRule(ruleQuery); } catch (EdgeRuleNotFoundException e) { - LOGGER.warn("Caught an edge rule not found exception for query {}, {}," + - " it could be the edge rule is no longer valid for the existing edge in db", - ruleQuery, LogFormatTools.getStackTop(e)); + LOGGER.warn( + "Caught an edge rule not found exception for query {}, {}," + + " it could be the edge rule is no longer valid for the existing edge in db", + ruleQuery, LogFormatTools.getStackTop(e)); continue; } catch (AmbiguousRuleChoiceException e) { - LOGGER.error("Caught an ambiguous rule not found exception for query {}, {}", - ruleQuery, LogFormatTools.getStackTop(e)); + LOGGER.error("Caught an ambiguous rule not found exception for query {}, {}", ruleQuery, + LogFormatTools.getStackTop(e)); continue; } Introspector relationshipObj = obj.newIntrospectorInstanceOfNestedProperty("relationship"); - Object result = processEdgeRelationship(relationshipObj, cousin, cleanUp,edgeRule.getLabel()); + Object result = processEdgeRelationship(relationshipObj, cousin, cleanUp, edgeRule.getLabel()); if (result != null) { relationshipObjList.add(result); } @@ -1200,26 +1228,27 @@ public class DBSerializer { * Process edge relationship. * * @param relationshipObj the relationship obj - * @param edge the edge - * @param cleanUp the clean up + * @param edge the edge + * @param cleanUp the clean up * @return the object - * @throws InstantiationException the instantiation exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception - * @throws MalformedURLException the malformed URL exception + * @throws AAIException the AAI exception + * @throws MalformedURLException the malformed URL exception * @throws AAIUnknownObjectException * @throws URISyntaxException */ - private Object processEdgeRelationship(Introspector relationshipObj, Vertex cousin, String cleanUp, String edgeLabel) throws UnsupportedEncodingException, AAIUnknownObjectException { + private Object processEdgeRelationship(Introspector relationshipObj, Vertex cousin, String cleanUp, + String edgeLabel) throws UnsupportedEncodingException, AAIUnknownObjectException { VertexProperty aaiUriProperty = cousin.property("aai-uri"); - if(!aaiUriProperty.isPresent()){ + if (!aaiUriProperty.isPresent()) { return null; } @@ -1231,16 +1260,16 @@ public class DBSerializer { uriParser = new URIToRelationshipObject(relationshipObj.getLoader(), uri, this.baseURL); result = uriParser.getResult(); } catch (AAIException | URISyntaxException e) { - LOGGER.error("Error while processing edge relationship in version " + relationshipObj.getVersion() + " (bad vertex ID=" + ": " - + e.getMessage() + " " + LogFormatTools.getStackTop(e)); + LOGGER.error("Error while processing edge relationship in version " + relationshipObj.getVersion() + + " (bad vertex ID=" + ": " + e.getMessage() + " " + LogFormatTools.getStackTop(e)); return null; } VertexProperty cousinVertexNodeType = cousin.property(AAIProperties.NODE_TYPE); - if(cousinVertexNodeType.isPresent()){ + if (cousinVertexNodeType.isPresent()) { String cousinType = cousinVertexNodeType.value().toString(); - if(namedPropNodes.contains(cousinType)){ + if (namedPropNodes.contains(cousinType)) { this.addRelatedToProperty(result, cousin, cousinType); } } @@ -1257,12 +1286,12 @@ public class DBSerializer { * * @param v the v * @return the URI for vertex - * @throws InstantiationException the instantiation exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception * @throws UnsupportedEncodingException the unsupported encoding exception * @throws AAIUnknownObjectException */ @@ -1301,15 +1330,17 @@ public class DBSerializer { return UriBuilder.fromPath(uri).build(); } - public void addRelatedToProperty(Introspector relationship, Vertex cousinVertex, String cousinType) throws AAIUnknownObjectException { + public void addRelatedToProperty(Introspector relationship, Vertex cousinVertex, String cousinType) + throws AAIUnknownObjectException { Introspector obj = null; try { obj = this.loader.introspectorFromName(cousinType); - } catch(AAIUnknownObjectException ex){ - if(LOGGER.isTraceEnabled()){ - LOGGER.trace("Encountered unknown object exception when trying to load nodetype of {} for vertex id {}", cousinType, cousinVertex.id()); + } catch (AAIUnknownObjectException ex) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Encountered unknown object exception when trying to load nodetype of {} for vertex id {}", + cousinType, cousinVertex.id()); } return; } @@ -1337,7 +1368,7 @@ public class DBSerializer { } - private Object getProperty(Introspector obj, String prop, Vertex vertex){ + private Object getProperty(Introspector obj, String prop, Vertex vertex) { final Map metadata = obj.getPropertyMetadata(prop); String dbPropertyName = prop; @@ -1353,12 +1384,13 @@ public class DBSerializer { * Creates the edge. * * @param relationship the relationship - * @param inputVertex the input vertex + * @param inputVertex the input vertex * @return true, if successful * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception */ - public boolean createEdge(Introspector relationship, Vertex inputVertex) throws UnsupportedEncodingException, AAIException { + public boolean createEdge(Introspector relationship, Vertex inputVertex) + throws UnsupportedEncodingException, AAIException { Vertex relatedVertex = null; StopWatch.conditionalStart(); @@ -1372,12 +1404,13 @@ public class DBSerializer { List results = parser.getQueryBuilder().toList(); if (results.isEmpty()) { dbTimeMsecs += StopWatch.stopIfStarted(); - AAIException e = new AAIException("AAI_6129", "Node of type " + parser.getResultType() + ". Could not find object at: " + parser.getUri()); + AAIException e = new AAIException("AAI_6129", + "Node of type " + parser.getResultType() + ". Could not find object at: " + parser.getUri()); e.getTemplateVars().add(parser.getResultType()); e.getTemplateVars().add(parser.getUri().toString()); throw e; } else { - //still an issue if there's more than one + // still an issue if there's more than one relatedVertex = results.get(0); } @@ -1389,7 +1422,7 @@ public class DBSerializer { if (e == null) { edgeSer.addEdge(this.engine.asAdmin().getTraversalSource(), inputVertex, relatedVertex, label); } else { - //attempted to link two vertexes already linked + // attempted to link two vertexes already linked } } finally { dbTimeMsecs += StopWatch.stopIfStarted(); @@ -1406,7 +1439,7 @@ public class DBSerializer { * @param aVertex the out vertex * @param bVertex the in vertex * @return the edges between - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception * @throws NoEdgeRuleFoundException */ private Edge getEdgeBetweenWithLabel(EdgeType type, Vertex aVertex, Vertex bVertex, EdgeRule edgeRule) { @@ -1416,32 +1449,25 @@ public class DBSerializer { if (bVertex != null) { GraphTraversal findEdgesBetween = null; if (EdgeType.TREE.equals(type)) { - GraphTraversal findVertex = this.engine.asAdmin().getTraversalSource().V(bVertex); - if(edgeRule.getDirection().equals(Direction.IN)){ + GraphTraversal findVertex = this.engine.asAdmin().getTraversalSource().V(bVertex); + if (edgeRule.getDirection().equals(Direction.IN)) { findEdgesBetween = findVertex.outE(edgeRule.getLabel()) - .has(EdgeProperty.CONTAINS.toString(), edgeRule.getContains()) - .not( - __.has(EdgeField.PRIVATE.toString(), true) - ); + .has(EdgeProperty.CONTAINS.toString(), edgeRule.getContains()) + .not(__.has(EdgeField.PRIVATE.toString(), true)); } else { findEdgesBetween = findVertex.inE(edgeRule.getLabel()) - .has(EdgeProperty.CONTAINS.toString(), edgeRule.getContains()) - .not( - __.has(EdgeField.PRIVATE.toString(), true) - ); + .has(EdgeProperty.CONTAINS.toString(), edgeRule.getContains()) + .not(__.has(EdgeField.PRIVATE.toString(), true)); } findEdgesBetween = findEdgesBetween.filter(__.otherV().hasId(aVertex.id())).limit(1); } else { findEdgesBetween = this.engine.asAdmin().getTraversalSource().V(aVertex).bothE(edgeRule.getLabel()); - findEdgesBetween = findEdgesBetween - .has(EdgeProperty.CONTAINS.toString(), "NONE") - .not( - __.has(EdgeField.PRIVATE.toString(), true) - ); + findEdgesBetween = findEdgesBetween.has(EdgeProperty.CONTAINS.toString(), "NONE") + .not(__.has(EdgeField.PRIVATE.toString(), true)); findEdgesBetween = findEdgesBetween.filter(__.otherV().hasId(bVertex.id())).limit(1); } List list = findEdgesBetween.toList(); - if(!list.isEmpty()){ + if (!list.isEmpty()) { result = list.get(0); } } @@ -1455,7 +1481,7 @@ public class DBSerializer { * @param aVertex the out vertex * @param bVertex the in vertex * @return the edges between - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception * @throws NoEdgeRuleFoundException */ private List getEdgesBetween(EdgeType type, Vertex aVertex, Vertex bVertex) { @@ -1466,19 +1492,11 @@ public class DBSerializer { GraphTraversal findEdgesBetween = null; findEdgesBetween = this.engine.asAdmin().getTraversalSource().V(aVertex).bothE(); if (EdgeType.TREE.equals(type)) { - findEdgesBetween = findEdgesBetween - .not( - __.or( - __.has(EdgeProperty.CONTAINS.toString(), "NONE"), - __.has(EdgeField.PRIVATE.toString(), true) - ) - ); + findEdgesBetween = findEdgesBetween.not(__.or(__.has(EdgeProperty.CONTAINS.toString(), "NONE"), + __.has(EdgeField.PRIVATE.toString(), true))); } else { - findEdgesBetween = findEdgesBetween - .has(EdgeProperty.CONTAINS.toString(), "NONE") - .not( - __.has(EdgeField.PRIVATE.toString(), true) - ); + findEdgesBetween = findEdgesBetween.has(EdgeProperty.CONTAINS.toString(), "NONE") + .not(__.has(EdgeField.PRIVATE.toString(), true)); } findEdgesBetween = findEdgesBetween.filter(__.otherV().hasId(bVertex.id())); result = findEdgesBetween.toList(); @@ -1504,19 +1522,11 @@ public class DBSerializer { GraphTraversal findEdgesBetween = null; findEdgesBetween = this.engine.asAdmin().getTraversalSource().V(aVertex).bothE(); if (EdgeType.TREE.equals(type)) { - findEdgesBetween = findEdgesBetween - .not( - __.or( - __.has(EdgeProperty.CONTAINS.toString(), "NONE"), - __.has(EdgeField.PRIVATE.toString(), true) - ) - ); + findEdgesBetween = findEdgesBetween.not(__.or(__.has(EdgeProperty.CONTAINS.toString(), "NONE"), + __.has(EdgeField.PRIVATE.toString(), true))); } else { - findEdgesBetween = findEdgesBetween - .has(EdgeProperty.CONTAINS.toString(), "NONE") - .not( - __.has(EdgeField.PRIVATE.toString(), true) - ); + findEdgesBetween = findEdgesBetween.has(EdgeProperty.CONTAINS.toString(), "NONE") + .not(__.has(EdgeField.PRIVATE.toString(), true)); } findEdgesBetween = findEdgesBetween.filter(__.otherV().hasId(bVertex.id())); result = findEdgesBetween.label().toList(); @@ -1540,16 +1550,14 @@ public class DBSerializer { if (bVertex != null) { GraphTraversal findEdgesBetween = null; findEdgesBetween = this.engine.asAdmin().getTraversalSource().V(aVertex).bothE(); - findEdgesBetween = findEdgesBetween - .has(EdgeProperty.CONTAINS.toString(), "NONE") - .not( - __.has(EdgeField.PRIVATE.toString(), true) - ); + findEdgesBetween = findEdgesBetween.has(EdgeProperty.CONTAINS.toString(), "NONE") + .not(__.has(EdgeField.PRIVATE.toString(), true)); findEdgesBetween = findEdgesBetween.filter(__.otherV().hasId(bVertex.id())); result = findEdgesBetween.count().next(); } return result; } + /** * Gets all the edges between the vertexes with the label and type. * @@ -1588,7 +1596,7 @@ public class DBSerializer { * @param bVertex the in vertex * @param label * @return the edge between - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception * @throws NoEdgeRuleFoundException */ public Edge getEdgeBetween(EdgeType type, Vertex aVertex, Vertex bVertex, String label) throws AAIException { @@ -1611,17 +1619,17 @@ public class DBSerializer { return this.getEdgeBetween(type, aVertex, bVertex, null); } - /** * Delete edge. * * @param relationship the relationship - * @param inputVertex the input vertex + * @param inputVertex the input vertex * @return true, if successful * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception + * @throws AAIException the AAI exception */ - public boolean deleteEdge(Introspector relationship, Vertex inputVertex) throws UnsupportedEncodingException, AAIException { + public boolean deleteEdge(Introspector relationship, Vertex inputVertex) + throws UnsupportedEncodingException, AAIException { Vertex relatedVertex = null; StopWatch.conditionalStart(); @@ -1707,7 +1715,7 @@ public class DBSerializer { * * @param vertices - list of vertices to delete from the graph */ - void delete(List vertices){ + void delete(List vertices) { StopWatch.conditionalStart(); for (Vertex v : vertices) { @@ -1721,13 +1729,14 @@ public class DBSerializer { /** * Delete. * - * @param v the v + * @param v the v * @param resourceVersion the resource version * @throws IllegalArgumentException the illegal argument exception - * @throws AAIException the AAI exception - * @throws InterruptedException the interrupted exception + * @throws AAIException the AAI exception + * @throws InterruptedException the interrupted exception */ - public void delete(Vertex v, List deletableVertices, String resourceVersion, boolean enableResourceVersion) throws IllegalArgumentException, AAIException { + public void delete(Vertex v, List deletableVertices, String resourceVersion, boolean enableResourceVersion) + throws IllegalArgumentException, AAIException { boolean result = verifyDeleteSemantics(v, resourceVersion, enableResourceVersion); /* @@ -1750,17 +1759,17 @@ public class DBSerializer { } - /** * Delete. * - * @param v the v + * @param v the v * @param resourceVersion the resource version * @throws IllegalArgumentException the illegal argument exception - * @throws AAIException the AAI exception - * @throws InterruptedException the interrupted exception + * @throws AAIException the AAI exception + * @throws InterruptedException the interrupted exception */ - public void delete(Vertex v, String resourceVersion, boolean enableResourceVersion) throws IllegalArgumentException, AAIException { + public void delete(Vertex v, String resourceVersion, boolean enableResourceVersion) + throws IllegalArgumentException, AAIException { boolean result = verifyDeleteSemantics(v, resourceVersion, enableResourceVersion); @@ -1779,18 +1788,20 @@ public class DBSerializer { /** * Verify delete semantics. * - * @param vertex the vertex + * @param vertex the vertex * @param resourceVersion the resource version * @return true, if successful * @throws AAIException the AAI exception */ - private boolean verifyDeleteSemantics(Vertex vertex, String resourceVersion, boolean enableResourceVersion) throws AAIException { + private boolean verifyDeleteSemantics(Vertex vertex, String resourceVersion, boolean enableResourceVersion) + throws AAIException { boolean result = true; String nodeType = ""; String errorDetail = " unknown delete semantic found"; String aaiExceptionCode = ""; nodeType = vertex.property(AAIProperties.NODE_TYPE).orElse(null); - if (enableResourceVersion && !this.verifyResourceVersion("delete", nodeType, vertex.property(AAIProperties.RESOURCE_VERSION).orElse(null), resourceVersion, nodeType)) { + if (enableResourceVersion && !this.verifyResourceVersion("delete", nodeType, + vertex.property(AAIProperties.RESOURCE_VERSION).orElse(null), resourceVersion, nodeType)) { } List vertices = new ArrayList(); vertices.add(vertex); @@ -1814,21 +1825,26 @@ public class DBSerializer { StopWatch.conditionalStart(); /* - * This takes in all the vertices in a cascade-delete-chain and checks if there is any edge with a "prevent-delete" condition + * This takes in all the vertices in a cascade-delete-chain and checks if there is any edge with a + * "prevent-delete" condition * If yes - that should prevent the deletion of the vertex * Dedup makes sure we dont capture the prevent-delete vertices twice * The prevent-delete vertices are stored so that the error message displays what prevents the delete */ - List preventDeleteVertices = this.engine.asAdmin().getReadOnlyTraversalSource().V(vertices). - union(__.inE().has(EdgeProperty.PREVENT_DELETE.toString(), AAIDirection.IN.toString()).outV().values(AAIProperties.NODE_TYPE), - __.outE().has(EdgeProperty.PREVENT_DELETE.toString(), AAIDirection.OUT.toString()).inV().values(AAIProperties.NODE_TYPE)) - .dedup().toList(); + List preventDeleteVertices = this.engine.asAdmin().getReadOnlyTraversalSource().V(vertices) + .union(__.inE().has(EdgeProperty.PREVENT_DELETE.toString(), AAIDirection.IN.toString()).outV() + .values(AAIProperties.NODE_TYPE), + __.outE().has(EdgeProperty.PREVENT_DELETE.toString(), AAIDirection.OUT.toString()).inV() + .values(AAIProperties.NODE_TYPE)) + .dedup().toList(); dbTimeMsecs += StopWatch.stopIfStarted(); if (!preventDeleteVertices.isEmpty()) { aaiExceptionCode = "AAI_6110"; - errorDetail = String.format("Object is being reference by additional objects preventing it from being deleted. Please clean up references from the following types %s", preventDeleteVertices); + errorDetail = String.format( + "Object is being reference by additional objects preventing it from being deleted. Please clean up references from the following types %s", + preventDeleteVertices); result = false; } if (!result) { @@ -1840,15 +1856,16 @@ public class DBSerializer { /** * Verify resource version. * - * @param action the action - * @param nodeType the node type + * @param action the action + * @param nodeType the node type * @param currentResourceVersion the current resource version - * @param resourceVersion the resource version - * @param uri the uri + * @param resourceVersion the resource version + * @param uri the uri * @return true, if successful * @throws AAIException the AAI exception */ - public boolean verifyResourceVersion(String action, String nodeType, String currentResourceVersion, String resourceVersion, String uri) throws AAIException { + public boolean verifyResourceVersion(String action, String nodeType, String currentResourceVersion, + String resourceVersion, String uri) throws AAIException { String enabled = ""; String errorDetail = ""; String aaiExceptionCode = ""; @@ -1870,7 +1887,8 @@ public class DBSerializer { if ("delete".equals(action)) { isDeleteResourceVersionOk = verifyResourceVersionForDelete(currentResourceVersion, resourceVersion); } - if ((!isDeleteResourceVersionOk) || ((!"delete".equals(action)) && (!currentResourceVersion.equals(resourceVersion)))) { + if ((!isDeleteResourceVersionOk) + || ((!"delete".equals(action)) && (!currentResourceVersion.equals(resourceVersion)))) { if ("create".equals(action) && !resourceVersion.equals("")) { errorDetail = "resource-version passed for " + action + " of " + uri; aaiExceptionCode = "AAI_6135"; @@ -1893,16 +1911,17 @@ public class DBSerializer { * Verify resource version for delete. * * @param currentResourceVersion the current resource version - * @param resourceVersion the resource version + * @param resourceVersion the resource version * @return true, if successful or false if there is a mismatch */ private boolean verifyResourceVersionForDelete(String currentResourceVersion, String resourceVersion) { boolean isDeleteResourceVersionOk = true; String resourceVersionDisabledUuid = AAIConfig.get(AAIConstants.AAI_RESVERSION_DISABLED_UUID, - AAIConstants.AAI_RESVERSION_DISABLED_UUID_DEFAULT); + AAIConstants.AAI_RESVERSION_DISABLED_UUID_DEFAULT); - if ((!currentResourceVersion.equals(resourceVersion)) && (!resourceVersion.equals(resourceVersionDisabledUuid))) { + if ((!currentResourceVersion.equals(resourceVersion)) + && (!resourceVersion.equals(resourceVersionDisabledUuid))) { isDeleteResourceVersionOk = false; } return isDeleteResourceVersionOk; @@ -1939,24 +1958,24 @@ public class DBSerializer { private void executePreSideEffects(Introspector obj, Vertex self) throws AAIException { - SideEffectRunner runner = new SideEffectRunner - .Builder(this.engine, this).addSideEffect(DataCopy.class).addSideEffect(PrivateEdge.class).build(); + SideEffectRunner runner = new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataCopy.class) + .addSideEffect(PrivateEdge.class).build(); runner.execute(obj, self); } private void executePostSideEffects(Introspector obj, Vertex self) throws AAIException { - SideEffectRunner runner = new SideEffectRunner - .Builder(this.engine, this).addSideEffect(DataLinkWriter.class).build(); + SideEffectRunner runner = + new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataLinkWriter.class).build(); runner.execute(obj, self); } private void enrichData(Introspector obj, Vertex self) throws AAIException { - SideEffectRunner runner = new SideEffectRunner - .Builder(this.engine, this).addSideEffect(DataLinkReader.class).build(); + SideEffectRunner runner = + new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataLinkReader.class).build(); runner.execute(obj, self); } @@ -1970,26 +1989,28 @@ public class DBSerializer { * This is for a one-time run with Tenant Isloation to only filter relationships * TODO: Chnage the original dbToObject to take filter parent/cousins * - * @param obj the obj - * @param v the vertex from the graph - * @param depth the depth - * @param nodeOnly specify if to exclude relationships or not + * @param obj the obj + * @param v the vertex from the graph + * @param depth the depth + * @param nodeOnly specify if to exclude relationships or not * @param filterCousinNodes * @return the introspector - * @throws AAIException the AAI exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws SecurityException the security exception - * @throws InstantiationException the instantiation exception - * @throws NoSuchMethodException the no such method exception + * @throws AAIException the AAI exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws NoSuchMethodException the no such method exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws MalformedURLException the malformed URL exception + * @throws MalformedURLException the malformed URL exception * @throws AAIUnknownObjectException * @throws URISyntaxException */ - //TODO - See if you can merge the 2 dbToObjectWithFilters - public Introspector dbToObjectWithFilters(Introspector obj, Vertex v, Set seen, int depth, boolean nodeOnly, List filterCousinNodes, List filterParentNodes) throws AAIException, UnsupportedEncodingException { + // TODO - See if you can merge the 2 dbToObjectWithFilters + public Introspector dbToObjectWithFilters(Introspector obj, Vertex v, Set seen, int depth, boolean nodeOnly, + List filterCousinNodes, List filterParentNodes) + throws AAIException, UnsupportedEncodingException { String cleanUp = "false"; if (depth < 0) { return null; @@ -2010,7 +2031,8 @@ public class DBSerializer { if (!property.equals("relationship-list") && depth >= 0) { Introspector argumentObject = obj.newIntrospectorInstanceOfProperty(property); - Object result = dbToObjectWithFilters(argumentObject, v, seen, depth + 1, nodeOnly, filterCousinNodes, filterParentNodes); + Object result = dbToObjectWithFilters(argumentObject, v, seen, depth + 1, nodeOnly, + filterCousinNodes, filterParentNodes); if (result != null) { obj.setValue(property, argumentObject.getUnderlyingObject()); modified = true; @@ -2018,7 +2040,8 @@ public class DBSerializer { } else if (property.equals("relationship-list") && !nodeOnly) { /* relationships need to be handled correctly */ Introspector relationshipList = obj.newIntrospectorInstanceOfProperty(property); - relationshipList = createFilteredRelationshipList(v, relationshipList, cleanUp, filterCousinNodes); + relationshipList = + createFilteredRelationshipList(v, relationshipList, cleanUp, filterCousinNodes); if (relationshipList != null) { modified = true; obj.setValue(property, relationshipList.getUnderlyingObject()); @@ -2037,7 +2060,8 @@ public class DBSerializer { String vType = v.property(AAIProperties.NODE_TYPE).orElse(null); EdgeRule rule; - boolean isthisParentRequired = filterParentNodes.parallelStream().anyMatch(childDbName::contains); + boolean isthisParentRequired = + filterParentNodes.parallelStream().anyMatch(childDbName::contains); EdgeRuleQuery q = new EdgeRuleQuery.Builder(vType, childDbName).edgeType(EdgeType.TREE).build(); @@ -2049,7 +2073,8 @@ public class DBSerializer { throw new MultipleEdgeRuleFoundException(e); } if (!rule.getContains().equals(AAIDirection.NONE.toString()) && isthisParentRequired) { - //vertices = this.queryEngine.findRelatedVertices(v, Direction.OUT, rule.getLabel(), childDbName); + // vertices = this.queryEngine.findRelatedVertices(v, Direction.OUT, rule.getLabel(), + // childDbName); Direction ruleDirection = rule.getDirection(); Iterator itr = v.vertices(ruleDirection, rule.getLabel()); List verticesList = (List) IteratorUtils.toList(itr); @@ -2066,7 +2091,8 @@ public class DBSerializer { if (!seen.contains(childVertex)) { Introspector argumentObject = obj.newIntrospectorInstanceOfNestedProperty(property); - Object result = dbToObjectWithFilters(argumentObject, childVertex, seen, depth, nodeOnly, filterCousinNodes, filterParentNodes); + Object result = dbToObjectWithFilters(argumentObject, childVertex, seen, depth, + nodeOnly, filterCousinNodes, filterParentNodes); if (result != null) { getList.add(argumentObject.getUnderlyingObject()); } @@ -2074,11 +2100,12 @@ public class DBSerializer { processed++; } else { removed++; - LOGGER.warn("Cycle found while serializing vertex id={}", childVertex.id().toString()); + LOGGER.warn("Cycle found while serializing vertex id={}", + childVertex.id().toString()); } } if (processed == 0) { - //vertices were all seen, reset the list + // vertices were all seen, reset the list getList = null; } if (processed > 0) { @@ -2100,7 +2127,7 @@ public class DBSerializer { } } - //no changes were made to this obj, discard the instance + // no changes were made to this obj, discard the instance if (!modified) { return null; } @@ -2112,22 +2139,23 @@ public class DBSerializer { /** * Creates the relationship list with the filtered node types. * - * @param v the v - * @param obj the obj + * @param v the v + * @param obj the obj * @param cleanUp the clean up * @return the object - * @throws InstantiationException the instantiation exception - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception + * @throws InstantiationException the instantiation exception + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception * @throws UnsupportedEncodingException the unsupported encoding exception - * @throws AAIException the AAI exception - * @throws MalformedURLException the malformed URL exception + * @throws AAIException the AAI exception + * @throws MalformedURLException the malformed URL exception * @throws URISyntaxException */ - private Introspector createFilteredRelationshipList(Vertex v, Introspector obj, String cleanUp, List filterNodes) throws UnsupportedEncodingException, AAIException { + private Introspector createFilteredRelationshipList(Vertex v, Introspector obj, String cleanUp, + List filterNodes) throws UnsupportedEncodingException, AAIException { List allCousins = this.engine.getQueryEngine().findCousinVertices(v); Iterator cousinVertices = allCousins.stream().filter(item -> { @@ -2135,10 +2163,9 @@ public class DBSerializer { return filterNodes.parallelStream().anyMatch(node::contains); }).iterator(); - List cousins = (List) IteratorUtils.toList(cousinVertices); - //items.parallelStream().anyMatch(inputStr::contains) + // items.parallelStream().anyMatch(inputStr::contains) List relationshipObjList = obj.getValue("relationship"); for (Vertex cousin : cousins) { @@ -2148,7 +2175,6 @@ public class DBSerializer { relationshipObjList.add(result); } - } if (relationshipObjList.isEmpty()) { diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/DeleteSemantic.java b/aai-core/src/main/java/org/onap/aai/serialization/db/DeleteSemantic.java index abaa8763..caa64caa 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/DeleteSemantic.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/DeleteSemantic.java @@ -17,23 +17,18 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.serialization.db; +package org.onap.aai.serialization.db; /** - * Possible values for deleteScope can be: - * USE_DEFAULT - Get the scope from ref data for this node - * THIS_NODE_ONLY (but should fail if it there are nodes that depend on it for uniqueness) - * CASCADE_TO_CHILDREN - will look for OUT-Edges that have parentOf/hasDelTarget = true and follow those down - * ERROR_4_IN_EDGES_OR_CASCADE - combo of error-if-any-IN-edges + CascadeToChildren - * ERROR_IF_ANY_IN_EDGES - Fail if this node has any existing IN edges - * ERROR_IF_ANY_EDGES - Fail if this node has any existing edges at all! + * Possible values for deleteScope can be: + * USE_DEFAULT - Get the scope from ref data for this node + * THIS_NODE_ONLY (but should fail if it there are nodes that depend on it for uniqueness) + * CASCADE_TO_CHILDREN - will look for OUT-Edges that have parentOf/hasDelTarget = true and follow those down + * ERROR_4_IN_EDGES_OR_CASCADE - combo of error-if-any-IN-edges + CascadeToChildren + * ERROR_IF_ANY_IN_EDGES - Fail if this node has any existing IN edges + * ERROR_IF_ANY_EDGES - Fail if this node has any existing edges at all! */ public enum DeleteSemantic { - USE_DEFAULT, - THIS_NODE_ONLY, - CASCADE_TO_CHILDREN, - ERROR_4_IN_EDGES_OR_CASCADE, - ERROR_IF_ANY_IN_EDGES, - ERROR_IF_ANY_EDGES, + USE_DEFAULT, THIS_NODE_ONLY, CASCADE_TO_CHILDREN, ERROR_4_IN_EDGES_OR_CASCADE, ERROR_IF_ANY_IN_EDGES, ERROR_IF_ANY_EDGES, } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeProperties.java b/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeProperties.java index c8340a7c..e460a270 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeProperties.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeProperties.java @@ -17,28 +17,29 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db; import org.onap.aai.edges.enums.EdgeProperty; public class EdgeProperties { - public static String out(EdgeProperty prop) { + public static String out(EdgeProperty prop) { + + return out(prop.toString()); + } - return out(prop.toString()); - } + public static String in(EdgeProperty prop) { + return in(prop.toString()); + } - public static String in(EdgeProperty prop) { - return in(prop.toString()); - } - - public static String out(String prop) { + public static String out(String prop) { - return prop; - } + return prop; + } - public static String in(String prop) { - return prop + "-REV"; - } + public static String in(String prop) { + return prop + "-REV"; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/EdgePropertyMap.java b/aai-core/src/main/java/org/onap/aai/serialization/db/EdgePropertyMap.java index a6838848..777ddd87 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/EdgePropertyMap.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/EdgePropertyMap.java @@ -17,42 +17,42 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.serialization.db; -import org.apache.tinkerpop.gremlin.structure.Direction; +package org.onap.aai.serialization.db; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.tinkerpop.gremlin.structure.Direction; + public class EdgePropertyMap extends HashMap { - private static final long serialVersionUID = -8298355506617458683L; - - private static final Pattern variablePattern = Pattern.compile("(!)?\\$\\{(\\w+)\\}"); - - @Override - public V get(Object arg0) { - - V value = super.get(arg0); - - Matcher m = variablePattern.matcher(value.toString()); - if (m.find()) { - if (m.groupCount() == 2) { - if (m.group(1) == null) { - value = super.get(m.group(2)); - } else { - value = reverse(super.get(m.group(2))); - } - } - } - - return value; - } - - - protected V reverse(V value) { - - return (V)Direction.valueOf(value.toString()).opposite().toString(); - } + private static final long serialVersionUID = -8298355506617458683L; + + private static final Pattern variablePattern = Pattern.compile("(!)?\\$\\{(\\w+)\\}"); + + @Override + public V get(Object arg0) { + + V value = super.get(arg0); + + Matcher m = variablePattern.matcher(value.toString()); + if (m.find()) { + if (m.groupCount() == 2) { + if (m.group(1) == null) { + value = super.get(m.group(2)); + } else { + value = reverse(super.get(m.group(2))); + } + } + } + + return value; + } + + protected V reverse(V value) { + + return (V) Direction.valueOf(value.toString()).opposite().toString(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeSerializer.java b/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeSerializer.java index d4a2b51b..a5a08203 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeSerializer.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/EdgeSerializer.java @@ -17,13 +17,14 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db; import java.util.EnumMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.UUID; -import java.util.Map.Entry; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Direction; @@ -49,224 +50,236 @@ import org.springframework.stereotype.Component; @Component public class EdgeSerializer { - @Autowired - private EdgeIngestor edgerules; - - public EdgeSerializer(EdgeIngestor ei) { - this.edgerules = ei; - } - - /** - * Adds the tree edge. - * - * @param aVertex the out vertex - * @param bVertex the in vertex - * @return the edge - * @throws AAIException the AAI exception - */ - public Edge addTreeEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) throws AAIException { - return this.addEdge(EdgeType.TREE, traversalSource, aVertex, bVertex, false, null); - } - - /** - * Adds the edge. - * - * @param aVertex the out vertex - * @param bVertex the in vertex - * @return the edge - * @throws AAIException the AAI exception - */ - public Edge addEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) throws AAIException { - return this.addEdge(traversalSource, aVertex, bVertex, null); - } - - public Edge addEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, String label) throws AAIException { - return this.addEdge(EdgeType.COUSIN, traversalSource, aVertex, bVertex, false, label); - } - - public Edge addPrivateEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, String label) throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { - return this.addEdge(EdgeType.COUSIN, traversalSource, aVertex, bVertex, false, label, true); - } - - private Edge addEdge(EdgeType type, GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, boolean isBestEffort, String label, boolean isPrivateEdge) throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { - - EdgeRule rule = null; - - String aType = aVertex.property(AAIProperties.NODE_TYPE).orElse(null); - String bType = bVertex.property(AAIProperties.NODE_TYPE).orElse(null); - EdgeRuleQuery edgeQuery = new EdgeRuleQuery.Builder(aType, bType).label(label).setPrivate(isPrivateEdge).build(); - - rule = edgerules.getRule(edgeQuery); - - if(rule.isPrivateEdge() != isPrivateEdge){ - return null; - } - - Edge e = null; - - Optional message = this.validateMultiplicity(rule, traversalSource, aVertex, bVertex); - - if (message.isPresent() && !isBestEffort) { - throw new EdgeMultiplicityException(message.get()); - } - if (!message.isPresent()) { - if (rule.getDirection().equals(Direction.OUT)) { - e = aVertex.addEdge(rule.getLabel(), bVertex); - } else if (rule.getDirection().equals(Direction.IN)) { - e = bVertex.addEdge(rule.getLabel(), aVertex); - } - - this.addProperties(e, rule); - } - return e; - } - - /** - * Adds the tree edge. - * - * @param aVertex the out vertex - * @param bVertex the in vertex - * @return the edge - * @throws AAIException the AAI exception - */ - public Edge addTreeEdgeIfPossible(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) throws AAIException { - return this.addEdge(EdgeType.TREE, traversalSource, aVertex, bVertex, true, null); - } - - /** - * Adds the edge. - * - * @param aVertex the out vertex - * @param bVertex the in vertex - * @return the edge - * @throws AAIException the AAI exception - */ - public Edge addEdgeIfPossible(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) throws AAIException { - return this.addEdgeIfPossible(traversalSource, aVertex, bVertex, null); - } - - public Edge addEdgeIfPossible(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, String label) throws AAIException { - return this.addEdge(EdgeType.COUSIN, traversalSource, aVertex, bVertex, true, label); - } - - /** - * Adds the edge. - * - * @param type the type - * @param aVertex the out vertex - * @param bVertex the in vertex - * @return the edge - * @throws AAIException the AAI exception - */ - private Edge addEdge(EdgeType type, GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, boolean isBestEffort, String label) throws AAIException { - String aNodeType = (String)aVertex.property(AAIProperties.NODE_TYPE).value(); - String bNodeType = (String)bVertex.property(AAIProperties.NODE_TYPE).value(); - EdgeRuleQuery q = new EdgeRuleQuery.Builder(aNodeType, bNodeType).label(label).edgeType(type).build(); - EdgeRule rule; - try { - rule = edgerules.getRule(q); - } catch (EdgeRuleNotFoundException e1) { - throw new NoEdgeRuleFoundException(e1); - } catch (AmbiguousRuleChoiceException e1) { - throw new MultipleEdgeRuleFoundException(e1); - } - - Edge e = null; - - Optional message = this.validateMultiplicity(rule, traversalSource, aVertex, bVertex); - - if (message.isPresent() && !isBestEffort) { - throw new EdgeMultiplicityException(message.get()); - } - if (!message.isPresent()) { - if (rule.getDirection().equals(Direction.OUT)) { - e = aVertex.addEdge(rule.getLabel(), bVertex); - } else if (rule.getDirection().equals(Direction.IN)) { - e = bVertex.addEdge(rule.getLabel(), aVertex); - } - - this.addProperties(e, rule); - } - return e; - } - - /** - * Adds the properties. - * - * @param edge the edge - * @param rule the rule - */ - public void addProperties(Edge edge, EdgeRule rule) { - Map propMap = new EnumMap<>(EdgeProperty.class); - propMap.put(EdgeProperty.CONTAINS, rule.getContains()); - propMap.put(EdgeProperty.DELETE_OTHER_V, rule.getDeleteOtherV()); - propMap.put(EdgeProperty.PREVENT_DELETE, rule.getPreventDelete()); - - for (Entry entry : propMap.entrySet()) { - edge.property(entry.getKey().toString(), entry.getValue()); - } - - edge.property(EdgeField.PRIVATE.toString(), rule.isPrivateEdge()); - edge.property(AAIProperties.AAI_UUID, UUID.randomUUID().toString()); - } - - /** - * Validate multiplicity. - * - * @param rule the rule - * @param aVertex the out vertex - * @param bVertex the in vertex - * @return true, if successful - * @throws AAIException the AAI exception - */ - private Optional validateMultiplicity(EdgeRule rule, GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) { - - Vertex a = aVertex; - Vertex b = bVertex; - - if (rule.getDirection().equals(Direction.OUT)) { - a = aVertex; - b = bVertex; - } else if (rule.getDirection().equals(Direction.IN)) { - a = bVertex; - b = aVertex; - } - - String aVertexType = a.property(AAIProperties.NODE_TYPE).orElse(null); - String bVertexType = b.property(AAIProperties.NODE_TYPE).orElse(null); - String label = rule.getLabel(); - - MultiplicityRule multiplicityRule = rule.getMultiplicityRule(); - - String detail = ""; - final String msg = "multiplicity rule violated: only one edge can exist with label: "; - - if (multiplicityRule.equals(MultiplicityRule.ONE2ONE)) { - Long outEdgesCnt = traversalSource.V(a).out(label).has(AAIProperties.NODE_TYPE, bVertexType).count().next(); - Long inEdgesCnt = traversalSource.V(b).in(label).has(AAIProperties.NODE_TYPE, aVertexType).count().next(); - if (aVertexType.equals(bVertexType)) { - inEdgesCnt = inEdgesCnt + traversalSource.V(a).in(label).has(AAIProperties.NODE_TYPE, aVertexType).count().next(); - outEdgesCnt = outEdgesCnt + traversalSource.V(b).out(label).has(AAIProperties.NODE_TYPE, bVertexType).count().next(); - } - if ( (inEdgesCnt != 0) || (outEdgesCnt != 0) ) { - detail = msg + label + " between " + aVertexType + " and " + bVertexType; - } - } else if (multiplicityRule.equals(MultiplicityRule.ONE2MANY)) { - Long inEdgesCnt = traversalSource.V(b).in(label).has(AAIProperties.NODE_TYPE, aVertexType).count().next(); - if (inEdgesCnt != 0) { - detail = msg + label + " between " + aVertexType + " and " + bVertexType; - } - } else if (multiplicityRule.equals(MultiplicityRule.MANY2ONE)) { - Long outEdgesCnt = traversalSource.V(a).out(label).has(AAIProperties.NODE_TYPE, bVertexType).count().next(); - if (outEdgesCnt != 0) { - detail = msg + label + " between " + aVertexType + " and " + bVertexType; - } - } - - if (!"".equals(detail)) { - return Optional.of(detail); - } else { - return Optional.empty(); - } - } + @Autowired + private EdgeIngestor edgerules; + + public EdgeSerializer(EdgeIngestor ei) { + this.edgerules = ei; + } + + /** + * Adds the tree edge. + * + * @param aVertex the out vertex + * @param bVertex the in vertex + * @return the edge + * @throws AAIException the AAI exception + */ + public Edge addTreeEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) throws AAIException { + return this.addEdge(EdgeType.TREE, traversalSource, aVertex, bVertex, false, null); + } + + /** + * Adds the edge. + * + * @param aVertex the out vertex + * @param bVertex the in vertex + * @return the edge + * @throws AAIException the AAI exception + */ + public Edge addEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) throws AAIException { + return this.addEdge(traversalSource, aVertex, bVertex, null); + } + + public Edge addEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, String label) + throws AAIException { + return this.addEdge(EdgeType.COUSIN, traversalSource, aVertex, bVertex, false, label); + } + + public Edge addPrivateEdge(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, String label) + throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { + return this.addEdge(EdgeType.COUSIN, traversalSource, aVertex, bVertex, false, label, true); + } + + private Edge addEdge(EdgeType type, GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, + boolean isBestEffort, String label, boolean isPrivateEdge) + throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { + + EdgeRule rule = null; + + String aType = aVertex.property(AAIProperties.NODE_TYPE).orElse(null); + String bType = bVertex.property(AAIProperties.NODE_TYPE).orElse(null); + EdgeRuleQuery edgeQuery = + new EdgeRuleQuery.Builder(aType, bType).label(label).setPrivate(isPrivateEdge).build(); + + rule = edgerules.getRule(edgeQuery); + + if (rule.isPrivateEdge() != isPrivateEdge) { + return null; + } + + Edge e = null; + + Optional message = this.validateMultiplicity(rule, traversalSource, aVertex, bVertex); + + if (message.isPresent() && !isBestEffort) { + throw new EdgeMultiplicityException(message.get()); + } + if (!message.isPresent()) { + if (rule.getDirection().equals(Direction.OUT)) { + e = aVertex.addEdge(rule.getLabel(), bVertex); + } else if (rule.getDirection().equals(Direction.IN)) { + e = bVertex.addEdge(rule.getLabel(), aVertex); + } + + this.addProperties(e, rule); + } + return e; + } + + /** + * Adds the tree edge. + * + * @param aVertex the out vertex + * @param bVertex the in vertex + * @return the edge + * @throws AAIException the AAI exception + */ + public Edge addTreeEdgeIfPossible(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) + throws AAIException { + return this.addEdge(EdgeType.TREE, traversalSource, aVertex, bVertex, true, null); + } + + /** + * Adds the edge. + * + * @param aVertex the out vertex + * @param bVertex the in vertex + * @return the edge + * @throws AAIException the AAI exception + */ + public Edge addEdgeIfPossible(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex) + throws AAIException { + return this.addEdgeIfPossible(traversalSource, aVertex, bVertex, null); + } + + public Edge addEdgeIfPossible(GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, String label) + throws AAIException { + return this.addEdge(EdgeType.COUSIN, traversalSource, aVertex, bVertex, true, label); + } + + /** + * Adds the edge. + * + * @param type the type + * @param aVertex the out vertex + * @param bVertex the in vertex + * @return the edge + * @throws AAIException the AAI exception + */ + private Edge addEdge(EdgeType type, GraphTraversalSource traversalSource, Vertex aVertex, Vertex bVertex, + boolean isBestEffort, String label) throws AAIException { + String aNodeType = (String) aVertex.property(AAIProperties.NODE_TYPE).value(); + String bNodeType = (String) bVertex.property(AAIProperties.NODE_TYPE).value(); + EdgeRuleQuery q = new EdgeRuleQuery.Builder(aNodeType, bNodeType).label(label).edgeType(type).build(); + EdgeRule rule; + try { + rule = edgerules.getRule(q); + } catch (EdgeRuleNotFoundException e1) { + throw new NoEdgeRuleFoundException(e1); + } catch (AmbiguousRuleChoiceException e1) { + throw new MultipleEdgeRuleFoundException(e1); + } + + Edge e = null; + + Optional message = this.validateMultiplicity(rule, traversalSource, aVertex, bVertex); + + if (message.isPresent() && !isBestEffort) { + throw new EdgeMultiplicityException(message.get()); + } + if (!message.isPresent()) { + if (rule.getDirection().equals(Direction.OUT)) { + e = aVertex.addEdge(rule.getLabel(), bVertex); + } else if (rule.getDirection().equals(Direction.IN)) { + e = bVertex.addEdge(rule.getLabel(), aVertex); + } + + this.addProperties(e, rule); + } + return e; + } + + /** + * Adds the properties. + * + * @param edge the edge + * @param rule the rule + */ + public void addProperties(Edge edge, EdgeRule rule) { + Map propMap = new EnumMap<>(EdgeProperty.class); + propMap.put(EdgeProperty.CONTAINS, rule.getContains()); + propMap.put(EdgeProperty.DELETE_OTHER_V, rule.getDeleteOtherV()); + propMap.put(EdgeProperty.PREVENT_DELETE, rule.getPreventDelete()); + + for (Entry entry : propMap.entrySet()) { + edge.property(entry.getKey().toString(), entry.getValue()); + } + + edge.property(EdgeField.PRIVATE.toString(), rule.isPrivateEdge()); + edge.property(AAIProperties.AAI_UUID, UUID.randomUUID().toString()); + } + + /** + * Validate multiplicity. + * + * @param rule the rule + * @param aVertex the out vertex + * @param bVertex the in vertex + * @return true, if successful + * @throws AAIException the AAI exception + */ + private Optional validateMultiplicity(EdgeRule rule, GraphTraversalSource traversalSource, Vertex aVertex, + Vertex bVertex) { + + Vertex a = aVertex; + Vertex b = bVertex; + + if (rule.getDirection().equals(Direction.OUT)) { + a = aVertex; + b = bVertex; + } else if (rule.getDirection().equals(Direction.IN)) { + a = bVertex; + b = aVertex; + } + + String aVertexType = a.property(AAIProperties.NODE_TYPE).orElse(null); + String bVertexType = b.property(AAIProperties.NODE_TYPE).orElse(null); + String label = rule.getLabel(); + + MultiplicityRule multiplicityRule = rule.getMultiplicityRule(); + + String detail = ""; + final String msg = "multiplicity rule violated: only one edge can exist with label: "; + + if (multiplicityRule.equals(MultiplicityRule.ONE2ONE)) { + Long outEdgesCnt = traversalSource.V(a).out(label).has(AAIProperties.NODE_TYPE, bVertexType).count().next(); + Long inEdgesCnt = traversalSource.V(b).in(label).has(AAIProperties.NODE_TYPE, aVertexType).count().next(); + if (aVertexType.equals(bVertexType)) { + inEdgesCnt = inEdgesCnt + + traversalSource.V(a).in(label).has(AAIProperties.NODE_TYPE, aVertexType).count().next(); + outEdgesCnt = outEdgesCnt + + traversalSource.V(b).out(label).has(AAIProperties.NODE_TYPE, bVertexType).count().next(); + } + if ((inEdgesCnt != 0) || (outEdgesCnt != 0)) { + detail = msg + label + " between " + aVertexType + " and " + bVertexType; + } + } else if (multiplicityRule.equals(MultiplicityRule.ONE2MANY)) { + Long inEdgesCnt = traversalSource.V(b).in(label).has(AAIProperties.NODE_TYPE, aVertexType).count().next(); + if (inEdgesCnt != 0) { + detail = msg + label + " between " + aVertexType + " and " + bVertexType; + } + } else if (multiplicityRule.equals(MultiplicityRule.MANY2ONE)) { + Long outEdgesCnt = traversalSource.V(a).out(label).has(AAIProperties.NODE_TYPE, bVertexType).count().next(); + if (outEdgesCnt != 0) { + detail = msg + label + " between " + aVertexType + " and " + bVertexType; + } + } + + if (!"".equals(detail)) { + return Optional.of(detail); + } else { + return Optional.empty(); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/GetAllPool.java b/aai-core/src/main/java/org/onap/aai/serialization/db/GetAllPool.java index 599906b9..08815432 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/GetAllPool.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/GetAllPool.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db; import java.util.concurrent.ExecutorService; @@ -24,22 +25,22 @@ import java.util.concurrent.Executors; public class GetAllPool { - private ExecutorService pool; - - private GetAllPool() { - pool = Executors.newWorkStealingPool(Runtime.getRuntime().availableProcessors()); - } - - private static class Helper { - private static final GetAllPool INSTANCE = new GetAllPool(); - } - - public static GetAllPool getInstance() { - return Helper.INSTANCE; - } - - public ExecutorService getPool() { - - return this.pool; - } + private ExecutorService pool; + + private GetAllPool() { + pool = Executors.newWorkStealingPool(Runtime.getRuntime().availableProcessors()); + } + + private static class Helper { + private static final GetAllPool INSTANCE = new GetAllPool(); + } + + public static GetAllPool getInstance() { + return Helper.INSTANCE; + } + + public ExecutorService getPool() { + + return this.pool; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/GraphSingleton.java b/aai-core/src/main/java/org/onap/aai/serialization/db/GraphSingleton.java index d70a7ee7..cb713d56 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/GraphSingleton.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/GraphSingleton.java @@ -17,52 +17,53 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db; +import java.util.concurrent.atomic.AtomicInteger; + import org.janusgraph.core.JanusGraph; import org.onap.aai.dbmap.AAIGraph; import org.onap.aai.dbmap.DBConnectionType; -import java.util.concurrent.atomic.AtomicInteger; - /* This class simply calls AAIGraph under the covers for now */ public class GraphSingleton { - protected AtomicInteger totalCount = new AtomicInteger(); - - private static class Helper { - private static final GraphSingleton INSTANCE = new GraphSingleton(); - } - - /** - * Gets the single instance of GraphSingleton. - * - * @return single instance of GraphSingleton - */ - public static GraphSingleton getInstance() { - return Helper.INSTANCE; + protected AtomicInteger totalCount = new AtomicInteger(); + + private static class Helper { + private static final GraphSingleton INSTANCE = new GraphSingleton(); + } + + /** + * Gets the single instance of GraphSingleton. + * + * @return single instance of GraphSingleton + */ + public static GraphSingleton getInstance() { + return Helper.INSTANCE; + + } + + /** + * Gets the count. + * + * @return the count + */ + public AtomicInteger getCount() { + return totalCount; + } + + /** + * Gets the tx graph. + * + * @return the tx graph + */ + public JanusGraph getTxGraph() { + return AAIGraph.getInstance().getGraph(); + } - } - - /** - * Gets the count. - * - * @return the count - */ - public AtomicInteger getCount() { - return totalCount; - } - - /** - * Gets the tx graph. - * - * @return the tx graph - */ - public JanusGraph getTxGraph() { - return AAIGraph.getInstance().getGraph(); - } - - public JanusGraph getTxGraph(DBConnectionType connectionType) { - return AAIGraph.getInstance().getGraph(connectionType); - } + public JanusGraph getTxGraph(DBConnectionType connectionType) { + return AAIGraph.getInstance().getGraph(connectionType); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/InMemoryGraphSingleton.java b/aai-core/src/main/java/org/onap/aai/serialization/db/InMemoryGraphSingleton.java index 0f4c3e7d..90f71db5 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/InMemoryGraphSingleton.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/InMemoryGraphSingleton.java @@ -17,42 +17,42 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.serialization.db; -import org.onap.aai.dbmap.DBConnectionType; +package org.onap.aai.serialization.db; import org.janusgraph.core.JanusGraph; +import org.onap.aai.dbmap.DBConnectionType; public class InMemoryGraphSingleton extends GraphSingleton { - private static JanusGraph inMemgraph; - - private static class Helper { - private static final InMemoryGraphSingleton INSTANCE = new InMemoryGraphSingleton(); - } - - /** - * Gets the single instance of JanusGraphSingleton. - * - * @return single instance of JanusGraphSingleton - */ - public static InMemoryGraphSingleton getInstance(JanusGraph graph) { - inMemgraph = graph; - return Helper.INSTANCE; - } - - /** - * Gets the tx graph. - * - * @return the tx graph - */ - @Override - public JanusGraph getTxGraph() { - return inMemgraph; - } - - @Override - public JanusGraph getTxGraph(DBConnectionType connectionType) { - return inMemgraph; - } + private static JanusGraph inMemgraph; + + private static class Helper { + private static final InMemoryGraphSingleton INSTANCE = new InMemoryGraphSingleton(); + } + + /** + * Gets the single instance of JanusGraphSingleton. + * + * @return single instance of JanusGraphSingleton + */ + public static InMemoryGraphSingleton getInstance(JanusGraph graph) { + inMemgraph = graph; + return Helper.INSTANCE; + } + + /** + * Gets the tx graph. + * + * @return the tx graph + */ + @Override + public JanusGraph getTxGraph() { + return inMemgraph; + } + + @Override + public JanusGraph getTxGraph(DBConnectionType connectionType) { + return inMemgraph; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/JanusGraphSingleton.java b/aai-core/src/main/java/org/onap/aai/serialization/db/JanusGraphSingleton.java index 4513d107..6482b011 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/JanusGraphSingleton.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/JanusGraphSingleton.java @@ -17,21 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db; /* This is class is just a wrapper of its parent */ public class JanusGraphSingleton extends GraphSingleton { - private static class Helper { - private static final JanusGraphSingleton INSTANCE = new JanusGraphSingleton(); - } - - /** - * Gets the single instance of JanusGraphSingleton. - * - * @return single instance of JanusGraphSingleton - */ - public static JanusGraphSingleton getInstance() { - return Helper.INSTANCE; - } + private static class Helper { + private static final JanusGraphSingleton INSTANCE = new JanusGraphSingleton(); + } + + /** + * Gets the single instance of JanusGraphSingleton. + * + * @return single instance of JanusGraphSingleton + */ + public static JanusGraphSingleton getInstance() { + return Helper.INSTANCE; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/EdgeMultiplicityException.java b/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/EdgeMultiplicityException.java index 74961cb8..675dfb77 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/EdgeMultiplicityException.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/EdgeMultiplicityException.java @@ -17,23 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db.exceptions; import org.onap.aai.exceptions.AAIException; public class EdgeMultiplicityException extends AAIException { - private static final long serialVersionUID = -5575661036426538012L; + private static final long serialVersionUID = -5575661036426538012L; - public EdgeMultiplicityException(String message) { - super("AAI_6140", message); - } + public EdgeMultiplicityException(String message) { + super("AAI_6140", message); + } - public EdgeMultiplicityException(Throwable cause) { - super("AAI_6140",cause); - } + public EdgeMultiplicityException(Throwable cause) { + super("AAI_6140", cause); + } - public EdgeMultiplicityException(String message, Throwable cause) { - super("AAI_6140", cause, message); - } + public EdgeMultiplicityException(String message, Throwable cause) { + super("AAI_6140", cause, message); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/MultipleEdgeRuleFoundException.java b/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/MultipleEdgeRuleFoundException.java index 98ba75be..c2a3c1a2 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/MultipleEdgeRuleFoundException.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/MultipleEdgeRuleFoundException.java @@ -17,23 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db.exceptions; import org.onap.aai.exceptions.AAIException; public class MultipleEdgeRuleFoundException extends AAIException { - private static final long serialVersionUID = -906843868234976763L; + private static final long serialVersionUID = -906843868234976763L; - public MultipleEdgeRuleFoundException(String message) { - super("AAI_6107", message); - } + public MultipleEdgeRuleFoundException(String message) { + super("AAI_6107", message); + } - public MultipleEdgeRuleFoundException(Throwable cause) { - super("AAI_6107",cause); - } + public MultipleEdgeRuleFoundException(Throwable cause) { + super("AAI_6107", cause); + } - public MultipleEdgeRuleFoundException(String message, Throwable cause) { - super("AAI_6107", cause, message); - } + public MultipleEdgeRuleFoundException(String message, Throwable cause) { + super("AAI_6107", cause, message); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/NoEdgeRuleFoundException.java b/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/NoEdgeRuleFoundException.java index 758d76c0..0f2a044d 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/NoEdgeRuleFoundException.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/db/exceptions/NoEdgeRuleFoundException.java @@ -17,23 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.db.exceptions; import org.onap.aai.exceptions.AAIException; public class NoEdgeRuleFoundException extends AAIException { - private static final long serialVersionUID = -906843868234976763L; - - public NoEdgeRuleFoundException(String message) { - super("AAI_6107", message); - } + private static final long serialVersionUID = -906843868234976763L; + + public NoEdgeRuleFoundException(String message) { + super("AAI_6107", message); + } - public NoEdgeRuleFoundException(Throwable cause) { - super("AAI_6107",cause); - } + public NoEdgeRuleFoundException(Throwable cause) { + super("AAI_6107", cause); + } - public NoEdgeRuleFoundException(String message, Throwable cause) { - super("AAI_6107", cause, message); - } + public NoEdgeRuleFoundException(String message, Throwable cause) { + super("AAI_6107", cause, message); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/InMemoryDBEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/InMemoryDBEngine.java index afc91bd3..86c32f4a 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/InMemoryDBEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/InMemoryDBEngine.java @@ -17,14 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines; -import org.janusgraph.core.JanusGraph; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; +import org.janusgraph.core.JanusGraph; import org.onap.aai.dbmap.DBConnectionType; import org.onap.aai.introspection.Loader; import org.onap.aai.query.builder.*; @@ -32,174 +37,168 @@ import org.onap.aai.serialization.db.InMemoryGraphSingleton; import org.onap.aai.serialization.engines.query.GraphTraversalQueryEngine; import org.onap.aai.serialization.engines.query.QueryEngine; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - public class InMemoryDBEngine extends TransactionalGraphEngine { - /** - * Instantiates a new JanusGraph DB engine. - * - * @param style - * the style - * @param loader - * the loader - */ - private JanusGraph graph = null; - - private static final TransactionalGraphEngine.Admin admin = null; - - public InMemoryDBEngine(QueryStyle style, DBConnectionType connectionType, Loader loader, JanusGraph graph) { - super(style, loader, connectionType, InMemoryGraphSingleton.getInstance(graph)); - this.graph = graph; - } - - /** - * Instantiates a new JanusGraph DB engine. - * - * @param style - * the style - * @param loader - * the loader - * @param connect - * the connect - */ - public InMemoryDBEngine(QueryStyle style, Loader loader, boolean connect, JanusGraph graph) { - super(style, loader); - if (connect) { - this.singleton = InMemoryGraphSingleton.getInstance(graph); - } - this.graph = graph; - } - - @Override - public QueryEngine getQueryEngine() { - - if (style.equals(QueryStyle.TRAVERSAL) || style.equals(QueryStyle.TRAVERSAL_URI)) { - - GraphTraversalSource traversalSource = graph.traversal(); - return new GraphTraversalQueryEngine(traversalSource); - - } else { - throw new IllegalArgumentException("Query Engine type not recognized"); - } - - } - - @Override - public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader) { - if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { - return new GremlinTraversal<>(loader, graph.traversal()); - } else if (style.equals(QueryStyle.TRAVERSAL)) { - return new TraversalQuery<>(loader, graph.traversal()); - } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { - return new TraversalURIOptimizedQuery<>(loader, graph.traversal()); - } else { - throw new IllegalArgumentException("Query Builder type is Not recognized"); - } - - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setListProperty(Vertex v, String name, List objs) { - - // clear out list full replace style - - Iterator> iterator = v.properties(name); - while (iterator.hasNext()) { - iterator.next().remove(); - } - if (objs != null) { - for (Object obj : objs) { - v.property(name, obj); - } - } - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public List getListProperty(Vertex v, String name) { - - List result = new ArrayList<>(); - - Iterator> iterator = v.properties(name); - - while (iterator.hasNext()) { - result.add(iterator.next().value()); - } - - if (result.isEmpty()) { - result = null; - } - - return result; - - } - - @Override - public QueryBuilder getQueryBuilder() { - return getQueryBuilder(this.loader); - } - - @Override - public QueryBuilder getQueryBuilder(Loader loader) { - if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { - return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource()); - } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { - return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource()); - } else if (style.equals(QueryStyle.TRAVERSAL)) { - return new TraversalQuery<>(loader, graph.traversal()); - } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { - return new TraversalURIOptimizedQuery<>(loader, graph.traversal()); - } else { - throw new IllegalArgumentException("Query Builder type not recognized"); - } - - } - - @Override - public QueryBuilder getQueryBuilder(Vertex start) { - return getQueryBuilder(this.loader, start); - } - - public GraphTraversalSource getTraversalSource() { - return graph.traversal(); - } - - @Override - public QueryBuilder getQueryBuilder(Loader loader, Vertex start) { - if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { - return new GremlinTraversal<>(loader, graph.traversal(), start); - } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { - return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource(), start); - } else if (style.equals(QueryStyle.TRAVERSAL)) { - return new TraversalQuery<>(loader, graph.traversal(), start); - } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { - return new TraversalURIOptimizedQuery<>(loader, graph.traversal(), start); - } else { - throw new IllegalArgumentException("Query Builder type not recognized"); - } - - } - - @Override - public Graph startTransaction() { - if (this.tx() == null) { - this.currentTx = graph.newTransaction(); - this.currentTraversal = this.tx().traversal(); - this.readOnlyTraversal = this.tx() - .traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance())); - } - return currentTx; - } - - + /** + * Instantiates a new JanusGraph DB engine. + * + * @param style + * the style + * @param loader + * the loader + */ + private JanusGraph graph = null; + + private static final TransactionalGraphEngine.Admin admin = null; + + public InMemoryDBEngine(QueryStyle style, DBConnectionType connectionType, Loader loader, JanusGraph graph) { + super(style, loader, connectionType, InMemoryGraphSingleton.getInstance(graph)); + this.graph = graph; + } + + /** + * Instantiates a new JanusGraph DB engine. + * + * @param style + * the style + * @param loader + * the loader + * @param connect + * the connect + */ + public InMemoryDBEngine(QueryStyle style, Loader loader, boolean connect, JanusGraph graph) { + super(style, loader); + if (connect) { + this.singleton = InMemoryGraphSingleton.getInstance(graph); + } + this.graph = graph; + } + + @Override + public QueryEngine getQueryEngine() { + + if (style.equals(QueryStyle.TRAVERSAL) || style.equals(QueryStyle.TRAVERSAL_URI)) { + + GraphTraversalSource traversalSource = graph.traversal(); + return new GraphTraversalQueryEngine(traversalSource); + + } else { + throw new IllegalArgumentException("Query Engine type not recognized"); + } + + } + + @Override + public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader) { + if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { + return new GremlinTraversal<>(loader, graph.traversal()); + } else if (style.equals(QueryStyle.TRAVERSAL)) { + return new TraversalQuery<>(loader, graph.traversal()); + } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { + return new TraversalURIOptimizedQuery<>(loader, graph.traversal()); + } else { + throw new IllegalArgumentException("Query Builder type is Not recognized"); + } + + } + + /** + * {@inheritDoc} + */ + @Override + public boolean setListProperty(Vertex v, String name, List objs) { + + // clear out list full replace style + + Iterator> iterator = v.properties(name); + while (iterator.hasNext()) { + iterator.next().remove(); + } + if (objs != null) { + for (Object obj : objs) { + v.property(name, obj); + } + } + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public List getListProperty(Vertex v, String name) { + + List result = new ArrayList<>(); + + Iterator> iterator = v.properties(name); + + while (iterator.hasNext()) { + result.add(iterator.next().value()); + } + + if (result.isEmpty()) { + result = null; + } + + return result; + + } + + @Override + public QueryBuilder getQueryBuilder() { + return getQueryBuilder(this.loader); + } + + @Override + public QueryBuilder getQueryBuilder(Loader loader) { + if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { + return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource()); + } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { + return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource()); + } else if (style.equals(QueryStyle.TRAVERSAL)) { + return new TraversalQuery<>(loader, graph.traversal()); + } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { + return new TraversalURIOptimizedQuery<>(loader, graph.traversal()); + } else { + throw new IllegalArgumentException("Query Builder type not recognized"); + } + + } + + @Override + public QueryBuilder getQueryBuilder(Vertex start) { + return getQueryBuilder(this.loader, start); + } + + public GraphTraversalSource getTraversalSource() { + return graph.traversal(); + } + + @Override + public QueryBuilder getQueryBuilder(Loader loader, Vertex start) { + if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { + return new GremlinTraversal<>(loader, graph.traversal(), start); + } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { + return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource(), start); + } else if (style.equals(QueryStyle.TRAVERSAL)) { + return new TraversalQuery<>(loader, graph.traversal(), start); + } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { + return new TraversalURIOptimizedQuery<>(loader, graph.traversal(), start); + } else { + throw new IllegalArgumentException("Query Builder type not recognized"); + } + + } + + @Override + public Graph startTransaction() { + if (this.tx() == null) { + this.currentTx = graph.newTransaction(); + this.currentTraversal = this.tx().traversal(); + this.readOnlyTraversal = + this.tx().traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance())); + } + return currentTx; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/JanusGraphDBEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/JanusGraphDBEngine.java index c12aa603..346cf026 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/JanusGraphDBEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/JanusGraphDBEngine.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines; import java.util.ArrayList; @@ -31,70 +32,70 @@ import org.onap.aai.serialization.db.JanusGraphSingleton; public class JanusGraphDBEngine extends TransactionalGraphEngine { - /** - * Instantiates a new JanusGraph DB engine. - * - * @param style the style - * @param loader the loader - */ - public JanusGraphDBEngine(QueryStyle style, DBConnectionType connectionType, Loader loader) { - super(style, loader, connectionType, JanusGraphSingleton.getInstance()); - } - - /** - * Instantiates a new JanusGraph DB engine. - * - * @param style the style - * @param loader the loader - * @param connect the connect - */ - public JanusGraphDBEngine(QueryStyle style, Loader loader, boolean connect) { - super(style, loader); - if (connect) { - this.singleton = JanusGraphSingleton.getInstance(); - } - } - - /** - * {@inheritDoc} - */ - @Override - public boolean setListProperty(Vertex v, String name, List objs) { - - //clear out list full replace style - - Iterator> iterator = v.properties(name); - while (iterator.hasNext()) { - iterator.next().remove(); - } - if (objs != null) { - for (Object obj : objs) { - v.property(name, obj); - } - } - return true; - } - - /** - * {@inheritDoc} - */ - @Override - public List getListProperty(Vertex v, String name) { - - List result = new ArrayList(); - - Iterator> iterator = v.properties(name); - - while (iterator.hasNext()) { - result.add(iterator.next().value()); - } - - if (result.size() == 0) { - result = null; - } - - return result; - - } - + /** + * Instantiates a new JanusGraph DB engine. + * + * @param style the style + * @param loader the loader + */ + public JanusGraphDBEngine(QueryStyle style, DBConnectionType connectionType, Loader loader) { + super(style, loader, connectionType, JanusGraphSingleton.getInstance()); + } + + /** + * Instantiates a new JanusGraph DB engine. + * + * @param style the style + * @param loader the loader + * @param connect the connect + */ + public JanusGraphDBEngine(QueryStyle style, Loader loader, boolean connect) { + super(style, loader); + if (connect) { + this.singleton = JanusGraphSingleton.getInstance(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean setListProperty(Vertex v, String name, List objs) { + + // clear out list full replace style + + Iterator> iterator = v.properties(name); + while (iterator.hasNext()) { + iterator.next().remove(); + } + if (objs != null) { + for (Object obj : objs) { + v.property(name, obj); + } + } + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public List getListProperty(Vertex v, String name) { + + List result = new ArrayList(); + + Iterator> iterator = v.properties(name); + + while (iterator.hasNext()) { + result.add(iterator.next().value()); + } + + if (result.size() == 0) { + result = null; + } + + return result; + + } + } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/QueryStyle.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/QueryStyle.java index 2a069588..c291fbcb 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/QueryStyle.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/QueryStyle.java @@ -17,8 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines; public enum QueryStyle { - GREMLIN_TRAVERSAL, GREMLIN_UNIQUE, GREMLINPIPELINE_TRAVERSAL, TRAVERSAL, TRAVERSAL_URI + GREMLIN_TRAVERSAL, GREMLIN_UNIQUE, GREMLINPIPELINE_TRAVERSAL, TRAVERSAL, TRAVERSAL_URI } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/TransactionalGraphEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/TransactionalGraphEngine.java index eaf6829c..731d6c23 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/TransactionalGraphEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/TransactionalGraphEngine.java @@ -17,14 +17,18 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines; -import org.janusgraph.core.JanusGraph; -import org.janusgraph.core.schema.JanusGraphManagement; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.janusgraph.core.JanusGraph; +import org.janusgraph.core.schema.JanusGraphManagement; import org.onap.aai.dbmap.DBConnectionType; import org.onap.aai.introspection.Loader; import org.onap.aai.query.builder.*; @@ -32,213 +36,216 @@ import org.onap.aai.serialization.db.GraphSingleton; import org.onap.aai.serialization.engines.query.GraphTraversalQueryEngine; import org.onap.aai.serialization.engines.query.QueryEngine; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - public abstract class TransactionalGraphEngine { - - protected GraphSingleton singleton = null; - protected QueryEngine queryEngine = null; - protected QueryBuilder queryBuilder = null; - protected QueryStyle style = null; - protected final DBConnectionType connectionType; - protected final Loader loader; - protected Graph currentTx = null; - protected GraphTraversalSource currentTraversal = null; - protected GraphTraversalSource readOnlyTraversal = null; - private final Admin admin; - /** - * Instantiates a new transactional graph engine. - * - * @param style the style - * @param loader the loader - */ - public TransactionalGraphEngine (QueryStyle style, Loader loader, DBConnectionType connectionType, GraphSingleton singleton) { - this.loader = loader; - this.style = style; - this.singleton = singleton; - this.connectionType = connectionType; - admin = new Admin(); - } - - public TransactionalGraphEngine (QueryStyle style, Loader loader) { - this.loader = loader; - this.style = style; - this.connectionType = DBConnectionType.REALTIME; - admin = new Admin(); - - } - - /** - * Sets the list property. - * - * @param v the v - * @param name the name - * @param obj the obj - * @return true, if successful - */ - public abstract boolean setListProperty(Vertex v, String name, List obj); - - /** - * Gets the list property. - * - * @param v the v - * @param name the name - * @return the list property - */ - public abstract List getListProperty(Vertex v, String name); - - /** - * Gets the graph. - * - * @return the graph - */ - private JanusGraph getGraph() { - return singleton.getTxGraph(this.connectionType); - } - - /** - * Gets the count. - * - * @return the count - */ - public AtomicInteger getCount() { - return singleton.getCount(); - } - - - /** - * Gets the query engine. - * - * @return the query engine - */ - public QueryEngine getQueryEngine() { - QueryEngine engine = null; - if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { - //this.queryEngine = new GremlinQueryEngine(this); - } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { - //this.queryEngine = new GremlinQueryEngine(this); - } else if (style.equals(QueryStyle.GREMLINPIPELINE_TRAVERSAL)) { - //this.queryEngine = new GremlinPipelineQueryEngine(this); - } else if (style.equals(QueryStyle.TRAVERSAL) || style.equals(QueryStyle.TRAVERSAL_URI)) { - - return new GraphTraversalQueryEngine(this.asAdmin().getTraversalSource()); - - } else { - throw new IllegalArgumentException("Query Engine type not recognized"); - } - - return engine; - } - - /** - * Gets the query builder. - * - * @return the query builder - */ - public QueryBuilder getQueryBuilder() { - return getQueryBuilder(this.loader); - } - - public QueryBuilder getQueryBuilder(QueryStyle style) { - return getQueryBuilder(style, this.loader); - } - - public QueryBuilder getQueryBuilder(Loader loader) { - return getQueryBuilder(this.style, loader); - } - - public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader) { - if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { - return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource()); - } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { - return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource()); - } else if (style.equals(QueryStyle.GREMLINPIPELINE_TRAVERSAL)) { - //return new GremlinPipelineTraversal(loader); - } else if (style.equals(QueryStyle.TRAVERSAL)) { - return new TraversalQuery<>(loader, this.asAdmin().getTraversalSource()); - } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { - return new TraversalURIOptimizedQuery<>(loader, this.asAdmin().getTraversalSource()); - } else { - throw new IllegalArgumentException("Query Builder type not recognized"); - } - return queryBuilder; - } - /** - * Gets the query builder. - * - * @param start the start - * @return the query builder - */ - public QueryBuilder getQueryBuilder(Vertex start) { - return getQueryBuilder(this.loader, start); - } - - public QueryBuilder getQueryBuilder(Loader loader, Vertex start) { - return getQueryBuilder(this.style, loader, start); - } - - public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader, Vertex start) { - if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { - return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource(), start); - } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { - return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource(), start); - } else if (style.equals(QueryStyle.GREMLINPIPELINE_TRAVERSAL)) { - //return new GremlinPipelineTraversal(loader,start); - } else if (style.equals(QueryStyle.TRAVERSAL)) { - return new TraversalQuery<>(loader, this.asAdmin().getTraversalSource(), start); - } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { - return new TraversalURIOptimizedQuery<>(loader, this.asAdmin().getTraversalSource(), start); - } else { - throw new IllegalArgumentException("Query Builder type not recognized"); - } - return queryBuilder; - } - public Graph startTransaction() { - if (this.tx() == null) { - this.currentTx = this.getGraph().newTransaction(); - this.currentTraversal = this.tx().traversal(); - this.readOnlyTraversal = this.tx().traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance())); - } - return currentTx; - } - - public void rollback() { - if (this.tx() != null) { - this.tx().tx().rollback(); - this.currentTx = null; - this.currentTraversal = null; - this.readOnlyTraversal = null; - } - } - public void commit() { - if (this.tx() != null) { - this.tx().tx().commit(); - this.currentTx = null; - this.currentTraversal = null; - this.readOnlyTraversal = null; - } - } - - public Graph tx() { - return this.currentTx; - } - - public Admin asAdmin() { - return admin; - } - - public class Admin { - - public GraphTraversalSource getTraversalSource() { - return currentTraversal; - } - public GraphTraversalSource getReadOnlyTraversalSource() { - return readOnlyTraversal; - } - - public JanusGraphManagement getManagementSystem() { - return getGraph().openManagement(); - } - } + + protected GraphSingleton singleton = null; + protected QueryEngine queryEngine = null; + protected QueryBuilder queryBuilder = null; + protected QueryStyle style = null; + protected final DBConnectionType connectionType; + protected final Loader loader; + protected Graph currentTx = null; + protected GraphTraversalSource currentTraversal = null; + protected GraphTraversalSource readOnlyTraversal = null; + private final Admin admin; + + /** + * Instantiates a new transactional graph engine. + * + * @param style the style + * @param loader the loader + */ + public TransactionalGraphEngine(QueryStyle style, Loader loader, DBConnectionType connectionType, + GraphSingleton singleton) { + this.loader = loader; + this.style = style; + this.singleton = singleton; + this.connectionType = connectionType; + admin = new Admin(); + } + + public TransactionalGraphEngine(QueryStyle style, Loader loader) { + this.loader = loader; + this.style = style; + this.connectionType = DBConnectionType.REALTIME; + admin = new Admin(); + + } + + /** + * Sets the list property. + * + * @param v the v + * @param name the name + * @param obj the obj + * @return true, if successful + */ + public abstract boolean setListProperty(Vertex v, String name, List obj); + + /** + * Gets the list property. + * + * @param v the v + * @param name the name + * @return the list property + */ + public abstract List getListProperty(Vertex v, String name); + + /** + * Gets the graph. + * + * @return the graph + */ + private JanusGraph getGraph() { + return singleton.getTxGraph(this.connectionType); + } + + /** + * Gets the count. + * + * @return the count + */ + public AtomicInteger getCount() { + return singleton.getCount(); + } + + /** + * Gets the query engine. + * + * @return the query engine + */ + public QueryEngine getQueryEngine() { + QueryEngine engine = null; + if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { + // this.queryEngine = new GremlinQueryEngine(this); + } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { + // this.queryEngine = new GremlinQueryEngine(this); + } else if (style.equals(QueryStyle.GREMLINPIPELINE_TRAVERSAL)) { + // this.queryEngine = new GremlinPipelineQueryEngine(this); + } else if (style.equals(QueryStyle.TRAVERSAL) || style.equals(QueryStyle.TRAVERSAL_URI)) { + + return new GraphTraversalQueryEngine(this.asAdmin().getTraversalSource()); + + } else { + throw new IllegalArgumentException("Query Engine type not recognized"); + } + + return engine; + } + + /** + * Gets the query builder. + * + * @return the query builder + */ + public QueryBuilder getQueryBuilder() { + return getQueryBuilder(this.loader); + } + + public QueryBuilder getQueryBuilder(QueryStyle style) { + return getQueryBuilder(style, this.loader); + } + + public QueryBuilder getQueryBuilder(Loader loader) { + return getQueryBuilder(this.style, loader); + } + + public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader) { + if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { + return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource()); + } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { + return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource()); + } else if (style.equals(QueryStyle.GREMLINPIPELINE_TRAVERSAL)) { + // return new GremlinPipelineTraversal(loader); + } else if (style.equals(QueryStyle.TRAVERSAL)) { + return new TraversalQuery<>(loader, this.asAdmin().getTraversalSource()); + } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { + return new TraversalURIOptimizedQuery<>(loader, this.asAdmin().getTraversalSource()); + } else { + throw new IllegalArgumentException("Query Builder type not recognized"); + } + return queryBuilder; + } + + /** + * Gets the query builder. + * + * @param start the start + * @return the query builder + */ + public QueryBuilder getQueryBuilder(Vertex start) { + return getQueryBuilder(this.loader, start); + } + + public QueryBuilder getQueryBuilder(Loader loader, Vertex start) { + return getQueryBuilder(this.style, loader, start); + } + + public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader, Vertex start) { + if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { + return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource(), start); + } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { + return new GremlinUnique<>(loader, this.asAdmin().getTraversalSource(), start); + } else if (style.equals(QueryStyle.GREMLINPIPELINE_TRAVERSAL)) { + // return new GremlinPipelineTraversal(loader,start); + } else if (style.equals(QueryStyle.TRAVERSAL)) { + return new TraversalQuery<>(loader, this.asAdmin().getTraversalSource(), start); + } else if (style.equals(QueryStyle.TRAVERSAL_URI)) { + return new TraversalURIOptimizedQuery<>(loader, this.asAdmin().getTraversalSource(), start); + } else { + throw new IllegalArgumentException("Query Builder type not recognized"); + } + return queryBuilder; + } + + public Graph startTransaction() { + if (this.tx() == null) { + this.currentTx = this.getGraph().newTransaction(); + this.currentTraversal = this.tx().traversal(); + this.readOnlyTraversal = + this.tx().traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance())); + } + return currentTx; + } + + public void rollback() { + if (this.tx() != null) { + this.tx().tx().rollback(); + this.currentTx = null; + this.currentTraversal = null; + this.readOnlyTraversal = null; + } + } + + public void commit() { + if (this.tx() != null) { + this.tx().tx().commit(); + this.currentTx = null; + this.currentTraversal = null; + this.readOnlyTraversal = null; + } + } + + public Graph tx() { + return this.currentTx; + } + + public Admin asAdmin() { + return admin; + } + + public class Admin { + + public GraphTraversalSource getTraversalSource() { + return currentTraversal; + } + + public GraphTraversalSource getReadOnlyTraversalSource() { + return readOnlyTraversal; + } + + public JanusGraphManagement getManagementSystem() { + return getGraph().openManagement(); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GraphTraversalQueryEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GraphTraversalQueryEngine.java index 94557b08..e012aef3 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GraphTraversalQueryEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GraphTraversalQueryEngine.java @@ -17,8 +17,8 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.serialization.engines.query; +package org.onap.aai.serialization.engines.query; import static org.onap.aai.edges.enums.AAIDirection.IN; import static org.onap.aai.edges.enums.AAIDirection.NONE; @@ -55,31 +55,32 @@ import org.onap.aai.logging.StopWatch; */ public class GraphTraversalQueryEngine extends QueryEngine { - /** - * Instantiates a new graph traversal query engine. - * - * @param g graph traversal source to traverse the graph - */ - public GraphTraversalQueryEngine(GraphTraversalSource g) { - super(g); - } + /** + * Instantiates a new graph traversal query engine. + * + * @param g graph traversal source to traverse the graph + */ + public GraphTraversalQueryEngine(GraphTraversalSource g) { + super(g); + } - /** - * {@inheritDoc} - */ - @Override - public List findParents(Vertex start) { - try { - StopWatch.conditionalStart(); + /** + * {@inheritDoc} + */ + @Override + public List findParents(Vertex start) { + try { + StopWatch.conditionalStart(); - @SuppressWarnings("unchecked") - final GraphTraversal pipe = this.g.V(start).emit(v -> true).repeat(__.union(__.inE().has(CONTAINS.toString(), OUT.toString()).outV(), __.outE().has(CONTAINS.toString(), IN.toString()).inV())); - return pipe.toList(); - } - finally { - dbTimeMsecs += StopWatch.stopIfStarted(); - } - } + @SuppressWarnings("unchecked") + final GraphTraversal pipe = this.g.V(start).emit(v -> true) + .repeat(__.union(__.inE().has(CONTAINS.toString(), OUT.toString()).outV(), + __.outE().has(CONTAINS.toString(), IN.toString()).inV())); + return pipe.toList(); + } finally { + dbTimeMsecs += StopWatch.stopIfStarted(); + } + } /** * {@inheritDoc} @@ -88,80 +89,73 @@ public class GraphTraversalQueryEngine extends QueryEngine { public List findParents(String[] uris) { try { StopWatch.conditionalStart(); - final GraphTraversal pipe = this.g.V() - .has(AAIProperties.AAI_URI, P.within(uris)) - .order().by(AAIProperties.AAI_URI, Order.decr); + final GraphTraversal pipe = + this.g.V().has(AAIProperties.AAI_URI, P.within(uris)).order().by(AAIProperties.AAI_URI, Order.decr); return pipe.toList(); - } - finally { + } finally { dbTimeMsecs += StopWatch.stopIfStarted(); } } - /** - * {@inheritDoc} - */ - @Override - public List findAllChildren(Vertex start) { - - @SuppressWarnings("unchecked") - GraphTraversal pipe = this.g - .V(start).emit(v -> true).repeat(__.union(__.outE().has(CONTAINS.toString(), OUT.toString()).inV(), __.inE().has(CONTAINS.toString(), IN.toString()).outV())); - + /** + * {@inheritDoc} + */ + @Override + public List findAllChildren(Vertex start) { - return pipe.toList(); + @SuppressWarnings("unchecked") + GraphTraversal pipe = this.g.V(start).emit(v -> true) + .repeat(__.union(__.outE().has(CONTAINS.toString(), OUT.toString()).inV(), + __.inE().has(CONTAINS.toString(), IN.toString()).outV())); - } + return pipe.toList(); - /** - * {@inheritDoc} - */ - @Override - public List findChildrenOfType(Vertex start, String type) { - @SuppressWarnings("unchecked") - GraphTraversal pipe = this.g.V(start).union( - __.outE().has(CONTAINS.toString(), OUT.toString()).inV(), - __.inE().has(CONTAINS.toString(), IN.toString()).outV() - ).has(AAIProperties.NODE_TYPE, type).dedup(); + } - return pipe.toList(); - } + /** + * {@inheritDoc} + */ + @Override + public List findChildrenOfType(Vertex start, String type) { + @SuppressWarnings("unchecked") + GraphTraversal pipe = this.g.V(start) + .union(__.outE().has(CONTAINS.toString(), OUT.toString()).inV(), + __.inE().has(CONTAINS.toString(), IN.toString()).outV()) + .has(AAIProperties.NODE_TYPE, type).dedup(); + + return pipe.toList(); + } - /** - * {@inheritDoc} - */ - @Override - public List findChildren(Vertex start) { - @SuppressWarnings("unchecked") - GraphTraversal pipe = this.g.V(start).union( - __.outE().has(CONTAINS.toString(), OUT.toString()), - __.inE().has(CONTAINS.toString(), IN.toString()) - ).otherV().dedup(); + /** + * {@inheritDoc} + */ + @Override + public List findChildren(Vertex start) { + @SuppressWarnings("unchecked") + GraphTraversal pipe = this.g.V(start).union(__.outE().has(CONTAINS.toString(), OUT.toString()), + __.inE().has(CONTAINS.toString(), IN.toString())).otherV().dedup(); - return pipe.toList(); - } + return pipe.toList(); + } - /** - * {@inheritDoc} - */ - @Override - public List findDeletable(Vertex start) { + /** + * {@inheritDoc} + */ + @Override + public List findDeletable(Vertex start) { try { StopWatch.conditionalStart(); @SuppressWarnings("unchecked") - GraphTraversal pipe = this.g - .V(start).emit(v -> true).repeat( - __.union( - __.outE().has(DELETE_OTHER_V.toString(), OUT.toString()).inV(), - __.inE().has(DELETE_OTHER_V.toString(), IN.toString()).outV() - ) - ).dedup(); + GraphTraversal pipe = this.g.V(start).emit(v -> true) + .repeat(__.union(__.outE().has(DELETE_OTHER_V.toString(), OUT.toString()).inV(), + __.inE().has(DELETE_OTHER_V.toString(), IN.toString()).outV())) + .dedup(); return pipe.toList(); } finally { dbTimeMsecs += StopWatch.stopIfStarted(); } - } + } /** * {@inheritDoc} @@ -172,119 +166,97 @@ public class GraphTraversalQueryEngine extends QueryEngine { StopWatch.conditionalStart(); Vertex[] vertices = new Vertex[startVertexes.size()]; vertices = startVertexes.toArray(vertices); - GraphTraversal pipe = this.g - .V(vertices).emit(v -> true).repeat( - __.union( - __.outE().has(DELETE_OTHER_V.toString(), OUT.toString()).inV(), - __.inE().has(DELETE_OTHER_V.toString(), IN.toString()).outV() - ) - ).dedup(); + GraphTraversal pipe = this.g.V(vertices).emit(v -> true) + .repeat(__.union(__.outE().has(DELETE_OTHER_V.toString(), OUT.toString()).inV(), + __.inE().has(DELETE_OTHER_V.toString(), IN.toString()).outV())) + .dedup(); return pipe.toList(); - } - finally { + } finally { dbTimeMsecs += StopWatch.stopIfStarted(); } } - /** - * {@inheritDoc} - */ - @Override - public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { - GraphTraversal pipe = this.g.V(start); - switch (direction) { - case OUT: - pipe.out(label); - break; - case IN: - pipe.in(label); - break; - case BOTH: - pipe.both(label); - break; - default: - break; - } - - pipe.has(AAIProperties.NODE_TYPE, nodeType).dedup(); - return pipe.toList(); - } - - @Override - public Tree findSubGraph(Vertex start, int iterations, boolean nodeOnly) { - final GraphTraversal t = this.g.V(start).emit(v -> true).times(iterations).repeat( - __.union( - __.outE().has(CONTAINS.toString(), OUT.toString()).inV(), - __.inE().has(CONTAINS.toString(), IN.toString()).outV()) - ); + /** + * {@inheritDoc} + */ + @Override + public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { + GraphTraversal pipe = this.g.V(start); + switch (direction) { + case OUT: + pipe.out(label); + break; + case IN: + pipe.in(label); + break; + case BOTH: + pipe.both(label); + break; + default: + break; + } - if (!nodeOnly) { - t.union( - __.identity(), - __.bothE().has(CONTAINS.toString(), NONE.toString()).dedup().otherV() - ); - } - t.tree(); - if (t.hasNext()) { - return (Tree)t.next(); - } else { - return new Tree(); - } - } + pipe.has(AAIProperties.NODE_TYPE, nodeType).dedup(); + return pipe.toList(); + } - @Override - public List findEdgesForVersion(Vertex start, Loader loader) { - // From the given start vertex find both the - // out edges that has property CONTAINS set to NONE - // whose in vertexes has an object that is declared in the oxm - // And do the same thing vice versa to get a list of edges - // Then check that the edge should not have the property private set to true - // and remove the duplicates and return the list of edges - final Set objects = loader.getAllObjects().keySet(); - GraphTraversal pipeline = this.g - .V(start) - .union( - __.inE().has(CONTAINS.toString(), NONE.toString()).where(__.outV().has(AAIProperties.NODE_TYPE, P.within(objects))), - __.outE().has(CONTAINS.toString(), NONE.toString()).where(__.inV().has(AAIProperties.NODE_TYPE, P.within(objects))) - ) - .not( - __.has("private", true) - ) - .dedup(); + @Override + public Tree findSubGraph(Vertex start, int iterations, boolean nodeOnly) { + final GraphTraversal t = this.g.V(start).emit(v -> true).times(iterations) + .repeat(__.union(__.outE().has(CONTAINS.toString(), OUT.toString()).inV(), + __.inE().has(CONTAINS.toString(), IN.toString()).outV())); - return pipeline.toList(); - } + if (!nodeOnly) { + t.union(__.identity(), __.bothE().has(CONTAINS.toString(), NONE.toString()).dedup().otherV()); + } + t.tree(); + if (t.hasNext()) { + return (Tree) t.next(); + } else { + return new Tree(); + } + } + @Override + public List findEdgesForVersion(Vertex start, Loader loader) { + // From the given start vertex find both the + // out edges that has property CONTAINS set to NONE + // whose in vertexes has an object that is declared in the oxm + // And do the same thing vice versa to get a list of edges + // Then check that the edge should not have the property private set to true + // and remove the duplicates and return the list of edges + final Set objects = loader.getAllObjects().keySet(); + GraphTraversal pipeline = this.g.V(start) + .union(__.inE().has(CONTAINS.toString(), NONE.toString()) + .where(__.outV().has(AAIProperties.NODE_TYPE, P.within(objects))), + __.outE().has(CONTAINS.toString(), NONE.toString()) + .where(__.inV().has(AAIProperties.NODE_TYPE, P.within(objects)))) + .not(__.has("private", true)).dedup(); + + return pipeline.toList(); + } - @Override - public List findCousinVertices(Vertex start, String... labels) { - // Start at the given vertex - // Do a union to copy the start vertex to be run against all - // so for the start vertex it gets all of in edges that contains other v set to none - // and also all the other out edges with contains other v set to none - // And filter the edges based on the property private not set + @Override + public List findCousinVertices(Vertex start, String... labels) { + // Start at the given vertex + // Do a union to copy the start vertex to be run against all + // so for the start vertex it gets all of in edges that contains other v set to none + // and also all the other out edges with contains other v set to none + // And filter the edges based on the property private not set // so that means it will be a regular edge - // and find the other end of the vertex so if setup like this: - // v2 -> e1 -> v3 - // It will return v3 - GraphTraversal pipeline = this.g - .V(start) - .union( - __.inE(labels).has(CONTAINS.toString(), NONE.toString()), - __.outE(labels).has(CONTAINS.toString(), NONE.toString()) - ) - .not( - __.has(PRIVATE.toString(), true) - ) - .otherV() - .dedup(); - - return pipeline.toList(); - } + // and find the other end of the vertex so if setup like this: + // v2 -> e1 -> v3 + // It will return v3 + GraphTraversal pipeline = this.g.V(start) + .union(__.inE(labels).has(CONTAINS.toString(), NONE.toString()), + __.outE(labels).has(CONTAINS.toString(), NONE.toString())) + .not(__.has(PRIVATE.toString(), true)).otherV().dedup(); + + return pipeline.toList(); + } - public double getDBTimeMsecs() { - return (dbTimeMsecs); - } + public double getDBTimeMsecs() { + return (dbTimeMsecs); + } } - diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinPipelineQueryEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinPipelineQueryEngine.java index 74a23ef9..c206ced7 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinPipelineQueryEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinPipelineQueryEngine.java @@ -8,7 +8,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,188 +17,189 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines.query;/*- - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +/* + * package org.onap.aai.serialization.engines.query; * - * http://www.apache.org/licenses/LICENSE-2.0 + * import java.util.HashSet; + * import java.util.List; + * import java.util.Set; * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= + * import org.onap.aai.db.AAIProperties; + * import org.onap.aai.query.builder.QueryBuilder; + * import org.onap.aai.serialization.engines.TransactionalGraphEngine; + * import com.tinkerpop.blueprints.Direction; + * import com.tinkerpop.blueprints.TransactionalGraph; + * import com.tinkerpop.blueprints.Vertex; + * import com.tinkerpop.gremlin.java.GremlinPipeline; + * import com.tinkerpop.pipes.IdentityPipe; + * import com.tinkerpop.pipes.PipeFunction; + * import com.tinkerpop.pipes.branch.LoopPipe; + * + * public class GremlinPipelineQueryEngine extends QueryEngine { + * + * public GremlinPipelineQueryEngine(TransactionalGraphEngine graphEngine) { + * super(graphEngine); + * } + * + * @Override + * public List executeQuery(TransactionalGraph g, QueryBuilder query) { + * List results = null; + * Vertex start = query.getStart(); + * if (start != null) { + * results = ((GremlinPipeline)query.getQuery()).cast(Vertex.class).toList(); + * } else { + * GremlinPipeline pipe = new GremlinPipeline(g); + * results = process(pipe, (GremlinPipeline)query.getQuery()); + * + * } + * return results; + * } + * + * @Override + * public List executeParentQuery(TransactionalGraph g, QueryBuilder query) { + * List results = null; + * Vertex start = query.getStart(); + * if (start != null) { + * results = ((GremlinPipeline)query.getParentQuery()).cast(Vertex.class).toList(); + * } else { + * GremlinPipeline pipe = new GremlinPipeline(g); + * results = process(pipe, (GremlinPipeline)query.getParentQuery()); + * + * } + * return results; + * } + * + * @Override + * public List findParents(Vertex start) { + * GremlinPipeline pipe = new GremlinPipeline(start).as("x").inE() + * .has("isParent", true).outV().loop("x", new PipeFunction, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle argument) { + * GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); + * return pipe.inE().has("isParent", true).count() == 1 || argument.getLoops() < 100; + * } + * + * }, new PipeFunction, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle argument) { + * return true; + * } + * + * }); + * + * List results = pipe.toList(); + * results.add(0, start); + * return results; + * } + * + * @Override + * public List findChildren(Vertex start) { + * Set seen = new HashSet<>(); + * seen.add(start); + * GremlinPipeline pipe = new GremlinPipeline(start).as("x").outE().has("isParent", true).inV() + * .except(seen).store(seen).loop("x", new PipeFunction, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle argument) { + * GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); + * return pipe.outE().has("isParent", true).count() >= 1 || argument.getLoops() < 100; + * } + * + * }, new PipeFunction, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle argument) { + * return true; + * } + * + * }); + * + * List results = pipe.toList(); + * results.add(0, start); + * return results; + * } + * + * @Override + * public List findDeletable(Vertex start) { + * Set seen = new HashSet<>(); + * seen.add(start); + * GremlinPipeline pipe = new GremlinPipeline(start).as("x").outE().or( + * new GremlinPipeline(new IdentityPipe()).has("isParent", true), + * new GremlinPipeline(new IdentityPipe()).has("hasDelTarget", true)).inV() + * .except(seen).store(seen).loop("x", new PipeFunction, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle argument) { + * GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); + * return pipe.outE().or( + * new GremlinPipeline(new IdentityPipe()).has("isParent", true), + * new GremlinPipeline(new IdentityPipe()).has("hasDelTarget", true)).count() >= 1 || argument.getLoops() < 100; + * } + * + * }, new PipeFunction, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle argument) { + * return true; + * } + * + * }); + * List results = pipe.toList(); + * results.add(0, start); + * + * return results; + * } + * + * private List process(GremlinPipeline start, GremlinPipeline pipe) { + * + * + * return start.add(pipe).cast(Vertex.class).toList(); + * } + * + * @Override + * public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { + * GremlinPipeline pipe = new GremlinPipeline(start); + * switch (direction) { + * case OUT: + * pipe.out(label); + * break; + * case IN: + * pipe.in(label); + * break; + * case BOTH: + * pipe.both(label); + * break; + * default: + * break; + * } + * + * pipe.has(AAIProperties.NODE_TYPE, nodeType).dedup(); + * List result = pipe.toList(); + * return result; + * } + * + * } */ - -/* -package org.onap.aai.serialization.engines.query; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.onap.aai.db.AAIProperties; -import org.onap.aai.query.builder.QueryBuilder; -import org.onap.aai.serialization.engines.TransactionalGraphEngine; -import com.tinkerpop.blueprints.Direction; -import com.tinkerpop.blueprints.TransactionalGraph; -import com.tinkerpop.blueprints.Vertex; -import com.tinkerpop.gremlin.java.GremlinPipeline; -import com.tinkerpop.pipes.IdentityPipe; -import com.tinkerpop.pipes.PipeFunction; -import com.tinkerpop.pipes.branch.LoopPipe; - -public class GremlinPipelineQueryEngine extends QueryEngine { - - public GremlinPipelineQueryEngine(TransactionalGraphEngine graphEngine) { - super(graphEngine); - } - - @Override - public List executeQuery(TransactionalGraph g, QueryBuilder query) { - List results = null; - Vertex start = query.getStart(); - if (start != null) { - results = ((GremlinPipeline)query.getQuery()).cast(Vertex.class).toList(); - } else { - GremlinPipeline pipe = new GremlinPipeline(g); - results = process(pipe, (GremlinPipeline)query.getQuery()); - - } - return results; - } - - @Override - public List executeParentQuery(TransactionalGraph g, QueryBuilder query) { - List results = null; - Vertex start = query.getStart(); - if (start != null) { - results = ((GremlinPipeline)query.getParentQuery()).cast(Vertex.class).toList(); - } else { - GremlinPipeline pipe = new GremlinPipeline(g); - results = process(pipe, (GremlinPipeline)query.getParentQuery()); - - } - return results; - } - - @Override - public List findParents(Vertex start) { - GremlinPipeline pipe = new GremlinPipeline(start).as("x").inE() - .has("isParent", true).outV().loop("x", new PipeFunction, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle argument) { - GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); - return pipe.inE().has("isParent", true).count() == 1 || argument.getLoops() < 100; - } - - }, new PipeFunction, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle argument) { - return true; - } - - }); - - List results = pipe.toList(); - results.add(0, start); - return results; - } - - @Override - public List findChildren(Vertex start) { - Set seen = new HashSet<>(); - seen.add(start); - GremlinPipeline pipe = new GremlinPipeline(start).as("x").outE().has("isParent", true).inV() - .except(seen).store(seen).loop("x", new PipeFunction, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle argument) { - GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); - return pipe.outE().has("isParent", true).count() >= 1 || argument.getLoops() < 100; - } - - }, new PipeFunction, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle argument) { - return true; - } - - }); - - List results = pipe.toList(); - results.add(0, start); - return results; - } - - @Override - public List findDeletable(Vertex start) { - Set seen = new HashSet<>(); - seen.add(start); - GremlinPipeline pipe = new GremlinPipeline(start).as("x").outE().or( - new GremlinPipeline(new IdentityPipe()).has("isParent", true), - new GremlinPipeline(new IdentityPipe()).has("hasDelTarget", true)).inV() - .except(seen).store(seen).loop("x", new PipeFunction, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle argument) { - GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); - return pipe.outE().or( - new GremlinPipeline(new IdentityPipe()).has("isParent", true), - new GremlinPipeline(new IdentityPipe()).has("hasDelTarget", true)).count() >= 1 || argument.getLoops() < 100; - } - - }, new PipeFunction, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle argument) { - return true; - } - - }); - List results = pipe.toList(); - results.add(0, start); - - return results; - } - - private List process(GremlinPipeline start, GremlinPipeline pipe) { - - - return start.add(pipe).cast(Vertex.class).toList(); - } - - @Override - public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { - GremlinPipeline pipe = new GremlinPipeline(start); - switch (direction) { - case OUT: - pipe.out(label); - break; - case IN: - pipe.in(label); - break; - case BOTH: - pipe.both(label); - break; - default: - break; - } - - pipe.has(AAIProperties.NODE_TYPE, nodeType).dedup(); - List result = pipe.toList(); - return result; - } - -} -*/ diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinQueryEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinQueryEngine.java index 18394ddc..568ff839 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinQueryEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/GremlinQueryEngine.java @@ -8,7 +8,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,178 +17,179 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines.query;/*- - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ // -//package org.onap.aai.serialization.engines.query; -// -//import java.util.List; -//import java.util.regex.Matcher; -//import java.util.regex.Pattern; -// -//import org.apache.commons.collections.IteratorUtils; -// -//import org.onap.aai.db.AAIProperties; -//import org.onap.aai.query.builder.QueryBuilder; -//import org.onap.aai.serialization.engines.TransactionalGraphEngine; -//import com.tinkerpop.blueprints.Direction; -//import com.tinkerpop.blueprints.Graph; -//import com.tinkerpop.blueprints.TransactionalGraph; -//import com.tinkerpop.blueprints.Vertex; -//import com.tinkerpop.gremlin.groovy.Gremlin; -//import com.tinkerpop.gremlin.java.GremlinPipeline; -//import com.tinkerpop.pipes.Pipe; -//import com.tinkerpop.pipes.util.iterators.SingleIterator; -// -//public class GremlinQueryEngine extends QueryEngine { -// -// public GremlinQueryEngine (TransactionalGraphEngine engine) { -// super(engine); -// -// } -// -// -// @Override -// public List executeQuery(TransactionalGraph g, QueryBuilder query) { -// List result = null; -// Vertex start = query.getStart(); -// if (start != null) { -// result = this.executeQuery(start, (String)query.getQuery()); -// } else { -// result = this.processGremlinQuery((String)query.getQuery()); -// } -// return result; -// -// } -// -// @Override -// public List executeParentQuery(TransactionalGraph g, QueryBuilder query) { -// -// List result = null; -// Vertex start = query.getStart(); -// if (start != null) { -// result = this.executeQuery(start, (String)query.getParentQuery()); -// } else { -// result = this.processGremlinQuery((String)query.getParentQuery()); -// } -// return result; -// } -// -// private List executeQuery(Vertex startVertex, String query) { -// -// return this.processGremlinQuery(startVertex, "_()" + query); -// -// } -// -// @Override -// public List findParents(Vertex start) { -// -// String findAllParents = ".as('x').inE.has('isParent', true).outV" -// + ".loop('x'){it.object.inE.has('isParent',true).count()==1}{true}"; -// -// List results = this.executeQuery(start, findAllParents); -// results.add(0, start); -// return results; -// -// } -// -// @Override -// public List findChildren(Vertex start) { -// String findAllChildren = ".as('x').outE.has('isParent', true).inV" -// + ".loop('x'){it.object.outE.has('isParent', true).count() >= 1}{true}"; -// -// List results = this.executeQuery(start, findAllChildren); -// results.add(0, start); -// return results; -// -// } -// -// @Override -// public List findDeletable(Vertex start) { -// String findAllChildren = ".as('x').outE.or(_().has('isParent', true), _().has('hasDelTarget', true)).inV" -// + ".loop('x'){it.object.outE.or(_().has('isParent', true), _().has('hasDelTarget', true)).count() >= 1}{true}"; -// -// List results = this.executeQuery(start, findAllChildren); -// results.add(0, start); -// return results; -// } -// private List processGremlinQuery(String query) { -// -// Pattern firstHasSet = Pattern.compile("^(\\.has\\(.*?\\))(\\.has\\(.*?\\))*(?!\\.has)"); -// Pattern p = Pattern.compile("\\.has\\('(.*?)',\\s?'(.*?)'\\)"); -// Matcher m = firstHasSet.matcher(query); -// List results = null; -// GremlinPipeline pipe = new GremlinPipeline<>(dbEngine.getGraph()); -// if (m.find()) { -// String hasSet = m.group(); -// query = query.replace(m.group(0), ""); -// m = p.matcher(hasSet); -// pipe.V(); -// while (m.find()) { -// pipe.has(m.group(1), m.group(2)); -// } -// results = processGremlinQuery(pipe.toList(), "_()" + query); -// } -// -// return results; -// -// } -// private List processGremlinQuery(Vertex startVertex, String query) { -// -// Pipe pipe = Gremlin.compile(query); -// pipe.setStarts(new SingleIterator(startVertex)); -// -// return (List)IteratorUtils.toList(pipe.iterator()); -// } -// private List processGremlinQuery(List list, String query) { -// -// Pipe pipe = Gremlin.compile(query); -// -// pipe.setStarts(list); -// -// return (List)IteratorUtils.toList(pipe.iterator()); -// } -// -// -// @Override -// public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { -// String findRelatedVertices = "_()"; -// switch (direction) { -// case OUT: -// findRelatedVertices += ".out('" + label + "')"; -// break; -// case IN: -// findRelatedVertices += ".in('" + label + "')"; -// break; -// case BOTH: -// findRelatedVertices += ".both('" + label + "')"; -// break; -// default: -// break; -// } -// findRelatedVertices += ".has('" + AAIProperties.NODE_TYPE + "', '" + nodeType + "').dedup()"; -// List results = this.executeQuery(start, findRelatedVertices); -// results.add(0, start); -// return results; -// } -// -//} +// package org.onap.aai.serialization.engines.query; +// +// import java.util.List; +// import java.util.regex.Matcher; +// import java.util.regex.Pattern; +// +// import org.apache.commons.collections.IteratorUtils; +// +// import org.onap.aai.db.AAIProperties; +// import org.onap.aai.query.builder.QueryBuilder; +// import org.onap.aai.serialization.engines.TransactionalGraphEngine; +// import com.tinkerpop.blueprints.Direction; +// import com.tinkerpop.blueprints.Graph; +// import com.tinkerpop.blueprints.TransactionalGraph; +// import com.tinkerpop.blueprints.Vertex; +// import com.tinkerpop.gremlin.groovy.Gremlin; +// import com.tinkerpop.gremlin.java.GremlinPipeline; +// import com.tinkerpop.pipes.Pipe; +// import com.tinkerpop.pipes.util.iterators.SingleIterator; +// +// public class GremlinQueryEngine extends QueryEngine { +// +// public GremlinQueryEngine (TransactionalGraphEngine engine) { +// super(engine); +// +// } +// +// +// @Override +// public List executeQuery(TransactionalGraph g, QueryBuilder query) { +// List result = null; +// Vertex start = query.getStart(); +// if (start != null) { +// result = this.executeQuery(start, (String)query.getQuery()); +// } else { +// result = this.processGremlinQuery((String)query.getQuery()); +// } +// return result; +// +// } +// +// @Override +// public List executeParentQuery(TransactionalGraph g, QueryBuilder query) { +// +// List result = null; +// Vertex start = query.getStart(); +// if (start != null) { +// result = this.executeQuery(start, (String)query.getParentQuery()); +// } else { +// result = this.processGremlinQuery((String)query.getParentQuery()); +// } +// return result; +// } +// +// private List executeQuery(Vertex startVertex, String query) { +// +// return this.processGremlinQuery(startVertex, "_()" + query); +// +// } +// +// @Override +// public List findParents(Vertex start) { +// +// String findAllParents = ".as('x').inE.has('isParent', true).outV" +// + ".loop('x'){it.object.inE.has('isParent',true).count()==1}{true}"; +// +// List results = this.executeQuery(start, findAllParents); +// results.add(0, start); +// return results; +// +// } +// +// @Override +// public List findChildren(Vertex start) { +// String findAllChildren = ".as('x').outE.has('isParent', true).inV" +// + ".loop('x'){it.object.outE.has('isParent', true).count() >= 1}{true}"; +// +// List results = this.executeQuery(start, findAllChildren); +// results.add(0, start); +// return results; +// +// } +// +// @Override +// public List findDeletable(Vertex start) { +// String findAllChildren = ".as('x').outE.or(_().has('isParent', true), _().has('hasDelTarget', true)).inV" +// + ".loop('x'){it.object.outE.or(_().has('isParent', true), _().has('hasDelTarget', true)).count() >= 1}{true}"; +// +// List results = this.executeQuery(start, findAllChildren); +// results.add(0, start); +// return results; +// } +// private List processGremlinQuery(String query) { +// +// Pattern firstHasSet = Pattern.compile("^(\\.has\\(.*?\\))(\\.has\\(.*?\\))*(?!\\.has)"); +// Pattern p = Pattern.compile("\\.has\\('(.*?)',\\s?'(.*?)'\\)"); +// Matcher m = firstHasSet.matcher(query); +// List results = null; +// GremlinPipeline pipe = new GremlinPipeline<>(dbEngine.getGraph()); +// if (m.find()) { +// String hasSet = m.group(); +// query = query.replace(m.group(0), ""); +// m = p.matcher(hasSet); +// pipe.V(); +// while (m.find()) { +// pipe.has(m.group(1), m.group(2)); +// } +// results = processGremlinQuery(pipe.toList(), "_()" + query); +// } +// +// return results; +// +// } +// private List processGremlinQuery(Vertex startVertex, String query) { +// +// Pipe pipe = Gremlin.compile(query); +// pipe.setStarts(new SingleIterator(startVertex)); +// +// return (List)IteratorUtils.toList(pipe.iterator()); +// } +// private List processGremlinQuery(List list, String query) { +// +// Pipe pipe = Gremlin.compile(query); +// +// pipe.setStarts(list); +// +// return (List)IteratorUtils.toList(pipe.iterator()); +// } +// +// +// @Override +// public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { +// String findRelatedVertices = "_()"; +// switch (direction) { +// case OUT: +// findRelatedVertices += ".out('" + label + "')"; +// break; +// case IN: +// findRelatedVertices += ".in('" + label + "')"; +// break; +// case BOTH: +// findRelatedVertices += ".both('" + label + "')"; +// break; +// default: +// break; +// } +// findRelatedVertices += ".has('" + AAIProperties.NODE_TYPE + "', '" + nodeType + "').dedup()"; +// List results = this.executeQuery(start, findRelatedVertices); +// results.add(0, start); +// return results; +// } +// +// } // diff --git a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/QueryEngine.java b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/QueryEngine.java index 1e2da4b8..4f30b564 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/engines/query/QueryEngine.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/engines/query/QueryEngine.java @@ -17,8 +17,11 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.engines.query; +import java.util.List; + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.structure.Direction; @@ -28,29 +31,28 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.db.props.AAIProperties; import org.onap.aai.introspection.Loader; -import java.util.List; - public abstract class QueryEngine { - final protected GraphTraversalSource g; - protected double dbTimeMsecs = 0; - /** - * Instantiates a new query engine. - * - * @param g graph traversal source to traverse the graph - */ - public QueryEngine (GraphTraversalSource g) { - this.g = g; - } - - /** - * Finds all the parents/grandparents/etc of the given start node. - * - * @param start - the start vertex whose parent chain you want - * @return the list of start and start's parent, grandparent, etc, in - * order (ie {start, parent, grandparent, etc} - */ - public abstract List findParents(Vertex start); + final protected GraphTraversalSource g; + protected double dbTimeMsecs = 0; + + /** + * Instantiates a new query engine. + * + * @param g graph traversal source to traverse the graph + */ + public QueryEngine(GraphTraversalSource g) { + this.g = g; + } + + /** + * Finds all the parents/grandparents/etc of the given start node. + * + * @param start - the start vertex whose parent chain you want + * @return the list of start and start's parent, grandparent, etc, in + * order (ie {start, parent, grandparent, etc} + */ + public abstract List findParents(Vertex start); /** * Finds all the parents/grandparents/etc of the given start node. @@ -62,113 +64,115 @@ public abstract class QueryEngine { * as the number of different type of edges keeps growing that call * will be more expensive than using the aai-uri's as they are fast lookup * - * @param uris - list of the uris representing the aai-uris of - * parent, grandparent, etc + * @param uris - list of the uris representing the aai-uris of + * parent, grandparent, etc * @return the list of start and start's parent, grandparent, etc, in - * order (ie {start, parent, grandparent, etc} + * order (ie {start, parent, grandparent, etc} + */ + public abstract List findParents(String[] uris); + + /** + * Finds all children, grandchildren, etc of start + * + * @param start the start vertex + * @return the list of child/grandchild/etc vertices + */ + public abstract List findAllChildren(Vertex start); + + /** + * Finds all immediate children of start (no grandchildren or so forth) of the given type + * + * @param start - the start vertex + * @param type - the desired aai-node-type + * @return the list of immediate child vertices of given type + */ + public abstract List findChildrenOfType(Vertex start, String type); + + /** + * Finds all immediate children of start (no grandchildren or so forth) + * + * @param start - the start vertex + * @return the list of immediate child vertices */ - public abstract List findParents(String [] uris); - - /** - * Finds all children, grandchildren, etc of start - * - * @param start the start vertex - * @return the list of child/grandchild/etc vertices - */ - public abstract List findAllChildren(Vertex start); - - /** - * Finds all immediate children of start (no grandchildren or so forth) of the given type - * @param start - the start vertex - * @param type - the desired aai-node-type - * @return the list of immediate child vertices of given type - */ - public abstract List findChildrenOfType(Vertex start, String type); - - /** - * Finds all immediate children of start (no grandchildren or so forth) - * @param start - the start vertex - * @return the list of immediate child vertices - */ - public abstract List findChildren(Vertex start); - - /** - * Find all vertices that should be deleted in a cascade from a delete of start - * - * @param start - the start vertex - * @return the list of vertices to be deleted when start is deleted - */ - public abstract List findDeletable(Vertex start); + public abstract List findChildren(Vertex start); + + /** + * Find all vertices that should be deleted in a cascade from a delete of start + * + * @param start - the start vertex + * @return the list of vertices to be deleted when start is deleted + */ + public abstract List findDeletable(Vertex start); /** * Find all vertices that should be deleted in a cascade from a delete of start vertexes * - * @param startVertexes Specifies the list of start vertexes + * @param startVertexes Specifies the list of start vertexes * - * @return the list of vertices to be deleted when start list of vertexes is deleted + * @return the list of vertices to be deleted when start list of vertexes is deleted */ public abstract List findDeletable(List startVertexes); - /** - * Finds the subgraph under start, including cousins as well as start's children/grandchildren/etc. - * More specifically, this includes start, all its descendants, start's cousins, and start's - * descendants' cousins (but not any of the cousins' cousins or descendants), and the edges - * connecting them. - * - * @param start - the start vertex - * @return - Tree containing nodes and edges of the subgraph - */ - public Tree findSubGraph(Vertex start) { - return findSubGraph(start, AAIProperties.MAXIMUM_DEPTH, false); - } - - /** - * Finds the subgraph under start, including cousins as well as start's children/grandchildren/etc. - * More specifically, this includes start, all its descendants, start's cousins, and start's - * descendants' cousins (but not any of the cousins' cousins or descendants), and the edges - * connecting them. - * - * @param start - the start vertex - * @param iterations - depth of the subgraph, this limits how many generations of - * descendants are included - * @param nodeOnly - if true the subgraph will NOT include the cousins - * @return Tree containing nodes and edges of the subgraph - */ - public abstract Tree findSubGraph(Vertex start, int iterations, boolean nodeOnly); - - /** - * Find vertices of type nodeType related to start by edges of the given - * direction and label. - * - * @param start - the start vertex - * @param direction - the direction of edges to traverse from start - * @param label - the label of edges to traverse from start - * @param nodeType - the node type the results should be - * @return the list of related vertices - */ - public abstract List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType); - - /** - * Finds cousin edges connecting start to other vertices only of types defined in an old version. - * The idea is that if a user is using an old version, they won't understand any new node types in - * subsequent versions. Thus, revealing edges to new types will cause problems. This methods - * filters any such edges out. - * - * @param start - the start vertex - * @param loader - loader for retrieving the list of allowed node types for the desired version - * (version is set when the loader was instantiated) - * @return list of cousin edges between start and any node types understood by the version specified in loader - */ - public abstract List findEdgesForVersion(Vertex start, Loader loader); - - /** - * Finds all cousins of start. - * - * @param start - the start vertex - * @return list of start's cousin vertices - */ - public abstract List findCousinVertices(Vertex start, String... labels); - - public abstract double getDBTimeMsecs(); + /** + * Finds the subgraph under start, including cousins as well as start's children/grandchildren/etc. + * More specifically, this includes start, all its descendants, start's cousins, and start's + * descendants' cousins (but not any of the cousins' cousins or descendants), and the edges + * connecting them. + * + * @param start - the start vertex + * @return - Tree containing nodes and edges of the subgraph + */ + public Tree findSubGraph(Vertex start) { + return findSubGraph(start, AAIProperties.MAXIMUM_DEPTH, false); + } + + /** + * Finds the subgraph under start, including cousins as well as start's children/grandchildren/etc. + * More specifically, this includes start, all its descendants, start's cousins, and start's + * descendants' cousins (but not any of the cousins' cousins or descendants), and the edges + * connecting them. + * + * @param start - the start vertex + * @param iterations - depth of the subgraph, this limits how many generations of + * descendants are included + * @param nodeOnly - if true the subgraph will NOT include the cousins + * @return Tree containing nodes and edges of the subgraph + */ + public abstract Tree findSubGraph(Vertex start, int iterations, boolean nodeOnly); + + /** + * Find vertices of type nodeType related to start by edges of the given + * direction and label. + * + * @param start - the start vertex + * @param direction - the direction of edges to traverse from start + * @param label - the label of edges to traverse from start + * @param nodeType - the node type the results should be + * @return the list of related vertices + */ + public abstract List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType); + + /** + * Finds cousin edges connecting start to other vertices only of types defined in an old version. + * The idea is that if a user is using an old version, they won't understand any new node types in + * subsequent versions. Thus, revealing edges to new types will cause problems. This methods + * filters any such edges out. + * + * @param start - the start vertex + * @param loader - loader for retrieving the list of allowed node types for the desired version + * (version is set when the loader was instantiated) + * @return list of cousin edges between start and any node types understood by the version specified in loader + */ + public abstract List findEdgesForVersion(Vertex start, Loader loader); + + /** + * Finds all cousins of start. + * + * @param start - the start vertex + * @return list of start's cousin vertices + */ + public abstract List findCousinVertices(Vertex start, String... labels); + + public abstract double getDBTimeMsecs(); } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java index d42f33f1..ba20c652 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java @@ -17,27 +17,29 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; -import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; import java.util.Optional; +import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; + public class Console implements FormatMapper { - @Override - public Optional formatObject(Object v) throws AAIFormatVertexException { - - JsonObject json = new JsonObject(); - json.addProperty("result", v.toString()); - - return Optional.of(json); - } - - @Override - public int parallelThreshold() { - return 100; - } + @Override + public Optional formatObject(Object v) throws AAIFormatVertexException { + + JsonObject json = new JsonObject(); + json.addProperty("result", v.toString()); + + return Optional.of(json); + } + + @Override + public int parallelThreshold() { + return 100; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Count.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Count.java index 053c8def..8ee4e3a4 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Count.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Count.java @@ -17,9 +17,15 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -28,53 +34,48 @@ import org.onap.aai.db.props.AAIProperties; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - public class Count implements FormatMapper { - @Override - public Optional formatObject(Object o) throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported { - @SuppressWarnings("unchecked") - List list = (List) o; - - final JsonObject countResult = new JsonObject(); - - list.stream().map(this::getCount) - .filter( Optional::isPresent ) - .map(Optional::get) - .collect( Collectors.toConcurrentMap( Pair::getValue0, Pair::getValue1, Long::sum ) ) - .forEach( (k,v) -> countResult.addProperty(k, v) ); - - return Optional.of(countResult); - } - - @Override - public int parallelThreshold() { - return 20; - } - - private Optional> getCount(Object o){ - - Pair pair = null; - - if (o instanceof Vertex) { - Vertex v = (Vertex) o; - pair = Pair.with(v.property(AAIProperties.NODE_TYPE).value().toString(), 1L); - } else if (o instanceof Tree) { - pair = Pair.with("trees", 1L); - } else if (o instanceof Path) { - pair = Pair.with("paths", 1L); - } else if (o instanceof Long) { - pair = Pair.with("count", (Long)o); - } - - if (pair == null) { - return Optional.>empty(); - } - - return Optional.>of(pair); - } + @Override + public Optional formatObject(Object o) + throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported { + @SuppressWarnings("unchecked") + List list = (List) o; + + final JsonObject countResult = new JsonObject(); + + list.stream().map(this::getCount).filter(Optional::isPresent).map(Optional::get) + .collect(Collectors.toConcurrentMap(Pair::getValue0, Pair::getValue1, Long::sum)) + .forEach((k, v) -> countResult.addProperty(k, v)); + + return Optional.of(countResult); + } + + @Override + public int parallelThreshold() { + return 20; + } + + private Optional> getCount(Object o) { + + Pair pair = null; + + if (o instanceof Vertex) { + Vertex v = (Vertex) o; + pair = Pair.with(v.property(AAIProperties.NODE_TYPE).value().toString(), 1L); + } else if (o instanceof Tree) { + pair = Pair.with("trees", 1L); + } else if (o instanceof Path) { + pair = Pair.with("paths", 1L); + } else if (o instanceof Long) { + pair = Pair.with("count", (Long) o); + } + + if (pair == null) { + return Optional.>empty(); + } + + return Optional.>of(pair); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java index 7e7356fe..8de38117 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java @@ -17,28 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import org.onap.aai.exceptions.AAIException; public enum Format { - graphson, - pathed, - pathed_resourceversion, - id, - resource, - simple, - resource_and_url, - console, - raw, - count, - resource_with_sot; + graphson, pathed, pathed_resourceversion, id, resource, simple, resource_and_url, console, raw, count, resource_with_sot; - public static Format getFormat(String format) throws AAIException { - try { - return Format.valueOf(format); - } catch (IllegalArgumentException e) { - throw new AAIException("AAI_6120", "Unsupported format query parameter " + format + " in request."); - } - } + public static Format getFormat(String format) throws AAIException { + try { + return Format.valueOf(format); + } catch (IllegalArgumentException e) { + throw new AAIException("AAI_6120", "Unsupported format query parameter " + format + " in request."); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java index f36941f8..854a20f4 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import javax.ws.rs.core.MultivaluedHashMap; @@ -32,72 +33,78 @@ import org.onap.aai.setup.SchemaVersions; public class FormatFactory { - private final Loader loader; - private final DBSerializer serializer; - private final UrlBuilder urlBuilder; - private final QueryParamInjector injector; + private final Loader loader; + private final DBSerializer serializer; + private final UrlBuilder urlBuilder; + private final QueryParamInjector injector; + + public FormatFactory(Loader loader, DBSerializer serializer, SchemaVersions schemaVersions, String basePath) + throws AAIException { + this.loader = loader; + this.serializer = serializer; + this.urlBuilder = new UrlBuilder(loader.getVersion(), serializer, schemaVersions, basePath); + this.injector = QueryParamInjector.getInstance(); + } + + public Formatter get(Format format) throws AAIException { + return get(format, new MultivaluedHashMap()); + } - public FormatFactory (Loader loader, DBSerializer serializer, SchemaVersions schemaVersions, String basePath) throws AAIException { - this.loader = loader; - this.serializer = serializer; - this.urlBuilder = new UrlBuilder(loader.getVersion(), serializer, schemaVersions, basePath); - this.injector = QueryParamInjector.getInstance(); - } - - public Formatter get(Format format) throws AAIException { - return get(format, new MultivaluedHashMap()); - } - - public Formatter get(Format format, MultivaluedMap params) throws AAIException { - - Formatter formatter = null; + public Formatter get(Format format, MultivaluedMap params) throws AAIException { - switch (format) { - case graphson : - formatter = new Formatter(inject(new GraphSON(), params)); - break; - case pathed : - formatter = new Formatter(inject(new PathedURL(loader, urlBuilder), params)); - break; - case pathed_resourceversion : + Formatter formatter = null; + + switch (format) { + case graphson: + formatter = new Formatter(inject(new GraphSON(), params)); + break; + case pathed: + formatter = new Formatter(inject(new PathedURL(loader, urlBuilder), params)); + break; + case pathed_resourceversion: formatter = new Formatter(inject(new PathedURL(loader, urlBuilder).includeUrl(), params)); break; - case id : - formatter = new Formatter(inject(new IdURL(loader, urlBuilder), params)); - break; - case resource : - formatter = new Formatter(inject(new Resource.Builder(loader, serializer, urlBuilder), params).build()); - break; - case resource_and_url : - formatter = new Formatter(inject(new Resource.Builder(loader, serializer, urlBuilder).includeUrl(), params).build()); - break; - case raw : - formatter = new Formatter(inject(new RawFormat.Builder(loader, serializer, urlBuilder), params).build()); - break; - case simple : - formatter = new Formatter(inject(new RawFormat.Builder(loader, serializer, urlBuilder).depth(0).modelDriven(), params).build()); - break; - case console : - formatter = new Formatter(inject(new Console(), params)); - break; - case count : - formatter = new Formatter(inject(new Count(), params)); - break; - case resource_with_sot : - formatter = new Formatter(inject(new ResourceWithSoT.Builder(loader, serializer, urlBuilder), params).build()); + case id: + formatter = new Formatter(inject(new IdURL(loader, urlBuilder), params)); + break; + case resource: + formatter = new Formatter(inject(new Resource.Builder(loader, serializer, urlBuilder), params).build()); + break; + case resource_and_url: + formatter = new Formatter( + inject(new Resource.Builder(loader, serializer, urlBuilder).includeUrl(), params).build()); + break; + case raw: + formatter = + new Formatter(inject(new RawFormat.Builder(loader, serializer, urlBuilder), params).build()); break; - default : - break; + case simple: + formatter = new Formatter( + inject(new RawFormat.Builder(loader, serializer, urlBuilder).depth(0).modelDriven(), params) + .build()); + break; + case console: + formatter = new Formatter(inject(new Console(), params)); + break; + case count: + formatter = new Formatter(inject(new Count(), params)); + break; + case resource_with_sot: + formatter = new Formatter( + inject(new ResourceWithSoT.Builder(loader, serializer, urlBuilder), params).build()); + break; + default: + break; + + } + + return formatter; + } + + private T inject(T obj, MultivaluedMap params) throws QueryParamInjectionException { + + injector.injectParams(obj, params); + return obj; + } - } - - return formatter; - } - - private T inject (T obj, MultivaluedMap params) throws QueryParamInjectionException { - - injector.injectParams(obj, params); - return obj; - } - } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java index 287170d0..26af2e31 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java @@ -17,17 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; -import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; -import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; import java.util.Optional; +import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; +import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; + public interface FormatMapper { - Optional formatObject(Object o) throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported; - - int parallelThreshold(); + Optional formatObject(Object o) throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported; + + int parallelThreshold(); } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java index 72847149..a19bd3f6 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.att.eelf.configuration.EELFLogger; @@ -24,74 +25,72 @@ import com.att.eelf.configuration.EELFManager; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.onap.aai.logging.LogFormatTools; -import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; -import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import org.onap.aai.logging.LogFormatTools; +import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; +import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; + public class Formatter { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(Formatter.class); - - protected JsonParser parser = new JsonParser(); - protected final FormatMapper format; - - public Formatter(FormatMapper format) { - this.format = format; - } - - public JsonObject output(List queryResults) { - - Stream stream; - JsonObject result = new JsonObject(); - JsonArray body = new JsonArray(); - - if (this.format instanceof Count) { - JsonObject countResult; - try { - countResult = format.formatObject(queryResults).orElseThrow(() -> new AAIFormatVertexException("")); - body.add(countResult); - } catch (Exception e) { - LOGGER.warn("Failed to format result type of the query " + LogFormatTools.getStackTop(e)); - } - } else { - if (queryResults.size() >= format.parallelThreshold()) { - stream = queryResults.parallelStream(); - } else { - stream = queryResults.stream(); - } - - final boolean isParallel = stream.isParallel(); - - stream.map(o -> { - try { - return format.formatObject(o); - } catch (AAIFormatVertexException e) { - LOGGER.warn("Failed to format vertex, returning a partial list " + LogFormatTools.getStackTop(e)); - } catch (AAIFormatQueryResultFormatNotSupported e) { - LOGGER.warn("Failed to format result type of the query " + LogFormatTools.getStackTop(e)); - } - - return Optional.empty(); - }) - .filter(Optional::isPresent) - .map(Optional::get) - .forEach(json -> { - if (isParallel) { - synchronized (body) { - body.add(json); - } - } else { - body.add(json); - } - }); - - } - result.add("results", body); - return result.getAsJsonObject(); - } + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(Formatter.class); + + protected JsonParser parser = new JsonParser(); + protected final FormatMapper format; + + public Formatter(FormatMapper format) { + this.format = format; + } + + public JsonObject output(List queryResults) { + + Stream stream; + JsonObject result = new JsonObject(); + JsonArray body = new JsonArray(); + + if (this.format instanceof Count) { + JsonObject countResult; + try { + countResult = format.formatObject(queryResults).orElseThrow(() -> new AAIFormatVertexException("")); + body.add(countResult); + } catch (Exception e) { + LOGGER.warn("Failed to format result type of the query " + LogFormatTools.getStackTop(e)); + } + } else { + if (queryResults.size() >= format.parallelThreshold()) { + stream = queryResults.parallelStream(); + } else { + stream = queryResults.stream(); + } + + final boolean isParallel = stream.isParallel(); + + stream.map(o -> { + try { + return format.formatObject(o); + } catch (AAIFormatVertexException e) { + LOGGER.warn("Failed to format vertex, returning a partial list " + LogFormatTools.getStackTop(e)); + } catch (AAIFormatQueryResultFormatNotSupported e) { + LOGGER.warn("Failed to format result type of the query " + LogFormatTools.getStackTop(e)); + } + + return Optional.empty(); + }).filter(Optional::isPresent).map(Optional::get).forEach(json -> { + if (isParallel) { + synchronized (body) { + body.add(json); + } + } else { + body.add(json); + } + }); + + } + result.add("results", body); + return result.getAsJsonObject(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java index 7e0f3f6c..eeac2195 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java @@ -17,17 +17,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.apache.tinkerpop.gremlin.structure.Direction; -import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper; -import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter; -import org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -37,93 +33,100 @@ import java.util.Iterator; import java.util.Map; import java.util.Optional; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter; +import org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry; + public class GraphSON implements FormatMapper { - private final GraphSONMapper mapper = GraphSONMapper.build().addRegistry(JanusGraphIoRegistry.getInstance()).create(); - private final GraphSONWriter writer = GraphSONWriter.build().mapper(mapper).create(); - protected JsonParser parser = new JsonParser(); - - @Override - public Optional formatObject(Object v) { - OutputStream os = new ByteArrayOutputStream(); - String result = ""; - try { - writer.writeVertex(os, (Vertex)v, Direction.BOTH); - - result = os.toString(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - JsonObject jsonObject = parser.parse(result).getAsJsonObject(); - - if(jsonObject != null){ - - if(jsonObject.has("outE")){ - JsonObject outEdges = jsonObject.get("outE").getAsJsonObject(); - removePrivateEdges(jsonObject, outEdges, "outE"); - } - - if(jsonObject.has("inE")){ - JsonObject inEdges = jsonObject.get("inE").getAsJsonObject(); - removePrivateEdges(jsonObject, inEdges, "inE"); - } - - } - - return Optional.of(jsonObject); - - } - - /** - * Removes the private edges from the json object - * - * Please note that the reason to choose to remove the private - * edges from the json object instead of removing it from the vertex - * itself is the fact that even though the transaction will be rolled back - * is because of the possible incosistent behavior where the actual edge - * might actually be removed in a long running transaction and is not worth the risk - * - * @param jsonObject - JSON Object from which we are removing the private edges for - * @param edges - JSONObject HashMap representing all of the edges - * @param edgeDirection - a string indicating the direction of the edge - */ - private void removePrivateEdges(JsonObject jsonObject, JsonObject edges, String edgeDirection) { - - Iterator it = edges.entrySet().iterator(); - while(it.hasNext()){ - Map.Entry outEntry = (Map.Entry) it.next(); - JsonArray edgePropertiesArray = outEntry.getValue().getAsJsonArray(); - for(int index = 0; index < edgePropertiesArray.size(); ++index){ - JsonElement jsonElement = edgePropertiesArray.get(index); - JsonObject obj = jsonElement.getAsJsonObject(); - if (obj.has("properties")) { - JsonObject objProperties = obj.get("properties").getAsJsonObject(); - if (objProperties.has("private")) { - boolean isPrivate = objProperties.get("private").getAsBoolean(); - if (isPrivate) { - if (edges.size() == 1) { - if (edgePropertiesArray.size() == 1) { - jsonObject.remove(edgeDirection); - } else { - edgePropertiesArray.remove(jsonElement); - } - } else { - edgePropertiesArray.remove(jsonElement); - } - } - } - } - } - if(edgePropertiesArray.size() == 0){ - it.remove(); - } - } - } - - @Override - public int parallelThreshold() { - return 50; - } + private final GraphSONMapper mapper = + GraphSONMapper.build().addRegistry(JanusGraphIoRegistry.getInstance()).create(); + private final GraphSONWriter writer = GraphSONWriter.build().mapper(mapper).create(); + protected JsonParser parser = new JsonParser(); + + @Override + public Optional formatObject(Object v) { + OutputStream os = new ByteArrayOutputStream(); + String result = ""; + try { + writer.writeVertex(os, (Vertex) v, Direction.BOTH); + + result = os.toString(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + JsonObject jsonObject = parser.parse(result).getAsJsonObject(); + + if (jsonObject != null) { + + if (jsonObject.has("outE")) { + JsonObject outEdges = jsonObject.get("outE").getAsJsonObject(); + removePrivateEdges(jsonObject, outEdges, "outE"); + } + + if (jsonObject.has("inE")) { + JsonObject inEdges = jsonObject.get("inE").getAsJsonObject(); + removePrivateEdges(jsonObject, inEdges, "inE"); + } + + } + + return Optional.of(jsonObject); + + } + + /** + * Removes the private edges from the json object + * + * Please note that the reason to choose to remove the private + * edges from the json object instead of removing it from the vertex + * itself is the fact that even though the transaction will be rolled back + * is because of the possible incosistent behavior where the actual edge + * might actually be removed in a long running transaction and is not worth the risk + * + * @param jsonObject - JSON Object from which we are removing the private edges for + * @param edges - JSONObject HashMap representing all of the edges + * @param edgeDirection - a string indicating the direction of the edge + */ + private void removePrivateEdges(JsonObject jsonObject, JsonObject edges, String edgeDirection) { + + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry outEntry = (Map.Entry) it.next(); + JsonArray edgePropertiesArray = outEntry.getValue().getAsJsonArray(); + for (int index = 0; index < edgePropertiesArray.size(); ++index) { + JsonElement jsonElement = edgePropertiesArray.get(index); + JsonObject obj = jsonElement.getAsJsonObject(); + if (obj.has("properties")) { + JsonObject objProperties = obj.get("properties").getAsJsonObject(); + if (objProperties.has("private")) { + boolean isPrivate = objProperties.get("private").getAsBoolean(); + if (isPrivate) { + if (edges.size() == 1) { + if (edgePropertiesArray.size() == 1) { + jsonObject.remove(edgeDirection); + } else { + edgePropertiesArray.remove(jsonElement); + } + } else { + edgePropertiesArray.remove(jsonElement); + } + } + } + } + } + if (edgePropertiesArray.size() == 0) { + it.remove(); + } + } + } + + @Override + public int parallelThreshold() { + return 50; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java index 6d344780..c5cb9254 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java @@ -17,10 +17,14 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; import com.google.gson.JsonParser; + +import java.util.Optional; + import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.db.props.AAIProperties; import org.onap.aai.exceptions.AAIException; @@ -30,42 +34,39 @@ import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; import org.onap.aai.serialization.queryformats.utils.UrlBuilder; -import java.util.Optional; - public class IdURL extends MultiFormatMapper { - private final UrlBuilder urlBuilder; - private final JsonParser parser; - private final Loader loader; + private final UrlBuilder urlBuilder; + private final JsonParser parser; + private final Loader loader; + + public IdURL(Loader loader, UrlBuilder urlBuilder) throws AAIException { + this.urlBuilder = urlBuilder; + this.parser = new JsonParser(); + this.loader = loader; + } + + @Override + public int parallelThreshold() { + return 2500; + } + + @Override + protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { - public IdURL (Loader loader, UrlBuilder urlBuilder) throws AAIException { - this.urlBuilder = urlBuilder; - this.parser = new JsonParser(); - this.loader = loader; - } - - @Override - public int parallelThreshold() { - return 2500; - } + try { + final Introspector searchResult = this.loader.introspectorFromName("result-data"); - @Override - protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + searchResult.setValue("resource-type", v.value(AAIProperties.NODE_TYPE)); + searchResult.setValue("resource-link", this.urlBuilder.id(v)); - try { - final Introspector searchResult = this.loader.introspectorFromName("result-data"); + final String json = searchResult.marshal(false); - searchResult.setValue("resource-type", v.value(AAIProperties.NODE_TYPE)); - searchResult.setValue("resource-link", this.urlBuilder.id(v)); + return Optional.of(parser.parse(json).getAsJsonObject()); - final String json = searchResult.marshal(false); + } catch (AAIUnknownObjectException e) { + throw new RuntimeException("Fatal error - result-data object does not exist!"); + } - return Optional.of(parser.parse(json).getAsJsonObject()); - - } catch (AAIUnknownObjectException e) { - throw new RuntimeException("Fatal error - result-data object does not exist!"); - } - - - } + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/MultiFormatMapper.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/MultiFormatMapper.java index 944c14c4..21b666f2 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/MultiFormatMapper.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/MultiFormatMapper.java @@ -17,92 +17,94 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonArray; import com.google.gson.JsonObject; + +import java.util.Iterator; +import java.util.List; +import java.util.Optional; + import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; - public abstract class MultiFormatMapper implements FormatMapper { - @Override - public Optional formatObject(Object input) throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported { - if (input instanceof Vertex) { - return this.getJsonFromVertex((Vertex) input); - } else if (input instanceof Tree) { - return this.getJsonFomTree((Tree) input); - } else if (input instanceof Path) { - return this.getJsonFromPath((Path) input); - } else { - throw new AAIFormatQueryResultFormatNotSupported(); - } - } - - protected abstract Optional getJsonFromVertex(Vertex input) throws AAIFormatVertexException; - - protected Optional getJsonFromPath(Path input) throws AAIFormatVertexException { - List path = input.objects(); - - JsonObject jo = new JsonObject(); - JsonArray ja = new JsonArray(); - - for (Object o : path) { - if (o instanceof Vertex) { - ja.add(this.getJsonFromVertex((Vertex)o).get()); - } - } - - jo.add("path", ja); - return Optional.of(jo); - } - - protected Optional getJsonFomTree(Tree tree) throws AAIFormatVertexException { - - if (tree.isEmpty()) { - return Optional.of(new JsonObject()); - } - - JsonObject t = new JsonObject(); - JsonArray ja = this.getNodesArray(tree); - if (ja.size() > 0) { - t.add("nodes", ja); - } - - return Optional.of(t); - } - - private JsonArray getNodesArray (Tree tree) throws AAIFormatVertexException { - - JsonArray nodes = new JsonArray(); - Iterator it = tree.keySet().iterator(); - - while (it.hasNext()) { - Object o = it.next(); - JsonObject me = new JsonObject(); - if (o instanceof Vertex) { - me = this.getJsonFromVertex((Vertex) o).get(); - } - JsonArray ja = this.getNodesArray((Tree) tree.get(o)); - if (ja.size() > 0) { - me.add("nodes", ja); - } - nodes.add(me); - } - return nodes; - } - - - @Override - public int parallelThreshold() { - return 100; - } + @Override + public Optional formatObject(Object input) + throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported { + if (input instanceof Vertex) { + return this.getJsonFromVertex((Vertex) input); + } else if (input instanceof Tree) { + return this.getJsonFomTree((Tree) input); + } else if (input instanceof Path) { + return this.getJsonFromPath((Path) input); + } else { + throw new AAIFormatQueryResultFormatNotSupported(); + } + } + + protected abstract Optional getJsonFromVertex(Vertex input) throws AAIFormatVertexException; + + protected Optional getJsonFromPath(Path input) throws AAIFormatVertexException { + List path = input.objects(); + + JsonObject jo = new JsonObject(); + JsonArray ja = new JsonArray(); + + for (Object o : path) { + if (o instanceof Vertex) { + ja.add(this.getJsonFromVertex((Vertex) o).get()); + } + } + + jo.add("path", ja); + return Optional.of(jo); + } + + protected Optional getJsonFomTree(Tree tree) throws AAIFormatVertexException { + + if (tree.isEmpty()) { + return Optional.of(new JsonObject()); + } + + JsonObject t = new JsonObject(); + JsonArray ja = this.getNodesArray(tree); + if (ja.size() > 0) { + t.add("nodes", ja); + } + + return Optional.of(t); + } + + private JsonArray getNodesArray(Tree tree) throws AAIFormatVertexException { + + JsonArray nodes = new JsonArray(); + Iterator it = tree.keySet().iterator(); + + while (it.hasNext()) { + Object o = it.next(); + JsonObject me = new JsonObject(); + if (o instanceof Vertex) { + me = this.getJsonFromVertex((Vertex) o).get(); + } + JsonArray ja = this.getNodesArray((Tree) tree.get(o)); + if (ja.size() > 0) { + me.add("nodes", ja); + } + nodes.add(me); + } + return nodes; + } + + @Override + public int parallelThreshold() { + return 100; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java index d2180e38..a99ba7f4 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java @@ -17,10 +17,14 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; import com.google.gson.JsonParser; + +import java.util.Optional; + import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.db.props.AAIProperties; import org.onap.aai.exceptions.AAIException; @@ -30,53 +34,49 @@ import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; import org.onap.aai.serialization.queryformats.utils.UrlBuilder; -import java.util.Optional; - public final class PathedURL extends MultiFormatMapper { - private final UrlBuilder urlBuilder; - private final JsonParser parser; - private final Loader loader; + private final UrlBuilder urlBuilder; + private final JsonParser parser; + private final Loader loader; private boolean includeUrl = false; - - public PathedURL (Loader loader, UrlBuilder urlBuilder) throws AAIException { - this.urlBuilder = urlBuilder; - this.parser = new JsonParser(); - this.loader = loader; - } + public PathedURL(Loader loader, UrlBuilder urlBuilder) throws AAIException { + this.urlBuilder = urlBuilder; + this.parser = new JsonParser(); + this.loader = loader; + } - @Override - public int parallelThreshold() { - return 20; - } + @Override + public int parallelThreshold() { + return 20; + } public PathedURL includeUrl() { this.includeUrl = true; return this; } - - @Override - protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + @Override + protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { - try { - final Introspector searchResult = this.loader.introspectorFromName("result-data"); + try { + final Introspector searchResult = this.loader.introspectorFromName("result-data"); - searchResult.setValue("resource-type", v.value(AAIProperties.NODE_TYPE)); + searchResult.setValue("resource-type", v.value(AAIProperties.NODE_TYPE)); - searchResult.setValue("resource-link", this.urlBuilder.pathed(v)); + searchResult.setValue("resource-link", this.urlBuilder.pathed(v)); - if(includeUrl) + if (includeUrl) searchResult.setValue("resource-version", v.value(AAIProperties.RESOURCE_VERSION)); - - final String json = searchResult.marshal(false); - return Optional.of(this.parser.parse(json).getAsJsonObject()); - } catch (AAIUnknownObjectException e) { - throw new RuntimeException("Fatal error - result-data does not exist!", e); - } + final String json = searchResult.marshal(false); + return Optional.of(this.parser.parse(json).getAsJsonObject()); - } + } catch (AAIUnknownObjectException e) { + throw new RuntimeException("Fatal error - result-data does not exist!", e); + } + + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java index e90ee6b1..8636ebfa 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java @@ -17,12 +17,18 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; + +import java.util.Iterator; +import java.util.List; +import java.util.Optional; + import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -35,178 +41,176 @@ import org.onap.aai.serialization.queryformats.params.Depth; import org.onap.aai.serialization.queryformats.params.NodesOnly; import org.onap.aai.serialization.queryformats.utils.UrlBuilder; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; +public class RawFormat extends MultiFormatMapper { + protected JsonParser parser = new JsonParser(); + protected final DBSerializer serializer; + protected final Loader loader; + protected final UrlBuilder urlBuilder; + protected final int depth; + protected final boolean nodesOnly; + protected RawFormat(Builder builder) { + this.urlBuilder = builder.getUrlBuilder(); + this.loader = builder.getLoader(); + this.serializer = builder.getSerializer(); + this.depth = builder.getDepth(); + this.nodesOnly = builder.isNodesOnly(); + } -public class RawFormat extends MultiFormatMapper { - protected JsonParser parser = new JsonParser(); - protected final DBSerializer serializer; - protected final Loader loader; - protected final UrlBuilder urlBuilder; - protected final int depth; - protected final boolean nodesOnly; - protected RawFormat(Builder builder) { - this.urlBuilder = builder.getUrlBuilder(); - this.loader = builder.getLoader(); - this.serializer = builder.getSerializer(); - this.depth = builder.getDepth(); - this.nodesOnly = builder.isNodesOnly(); - } - - @Override - public int parallelThreshold() { - return 100; - } - - - public Optional createPropertiesObject(Vertex v) throws AAIFormatVertexException { - JsonObject json = new JsonObject(); - Iterator> iter = v.properties(); - - while (iter.hasNext()) { - VertexProperty prop = iter.next(); - if (prop.value() instanceof String) { - json.addProperty(prop.key(), (String)prop.value()); - } else if (prop.value() instanceof Boolean) { - json.addProperty(prop.key(), (Boolean)prop.value()); - } else if (prop.value() instanceof Number) { - json.addProperty(prop.key(), (Number)prop.value()); - } else if (prop.value() instanceof List) { - Gson gson = new Gson(); - String list = gson.toJson(prop.value()); - - json.addProperty(prop.key(), list); - } else { - //throw exception? - return null; - } - } - - return Optional.of(json); - } - - protected JsonArray createRelationshipObject(Vertex v) throws AAIFormatVertexException { - JsonArray jarray = new JsonArray(); - Iterator inIter = v.edges(Direction.IN); - Iterator outIter = v.edges(Direction.OUT); - - while (inIter.hasNext()) { - Edge e = inIter.next(); - Vertex outVertex = e.outVertex(); - this.addEdge(e, outVertex, jarray); - } - - while (outIter.hasNext()) { - Edge e = outIter.next(); - Vertex inVertex = e.inVertex(); - this.addEdge(e, inVertex, jarray); - } - - return jarray; - } - - protected void addEdge(Edge e, Vertex vertex, JsonArray array) throws AAIFormatVertexException { - array.add(this.getRelatedObject(e.label(), vertex)); - } - - protected JsonObject getRelatedObject(String label, Vertex related) throws AAIFormatVertexException { - JsonObject json = new JsonObject(); - json.addProperty("id", related.id().toString()); - json.addProperty("relationship-label", label); - json.addProperty("node-type", related.value(AAIProperties.NODE_TYPE)); - json.addProperty("url", this.urlBuilder.pathed(related)); - - return json; - } - - public static class Builder implements NodesOnly, Depth { - - protected final Loader loader; - protected final DBSerializer serializer; - protected final UrlBuilder urlBuilder; - protected boolean includeUrl = false; - protected boolean nodesOnly = false; - protected int depth = 1; - protected boolean modelDriven = false; - public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) { - this.loader = loader; - this.serializer = serializer; - this.urlBuilder = urlBuilder; - } - - protected Loader getLoader() { - return this.loader; - } - - protected DBSerializer getSerializer() { - return this.serializer; - } - - protected UrlBuilder getUrlBuilder() { - return this.urlBuilder; - } - - public Builder includeUrl() { - this.includeUrl = true; - return this; - } - - public Builder nodesOnly(Boolean nodesOnly) { - this.nodesOnly = nodesOnly; - return this; - } - public boolean isNodesOnly() { - return this.nodesOnly; - } - - public Builder depth(Integer depth) { - this.depth = depth; - return this; - } - - public int getDepth() { - return this.depth; - } - - public boolean isIncludeUrl() { - return this.includeUrl; - } - - public Builder modelDriven() { - this.modelDriven = true; - return this; - } - - public boolean getModelDriven() { - return this.modelDriven; - } - public RawFormat build() { - if (modelDriven) { - return new SimpleFormat(this); - } else { - return new RawFormat(this); - } - } - } - - @Override - protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { - - JsonObject json = new JsonObject(); - json.addProperty("id", v.id().toString()); - json.addProperty("node-type", v.value(AAIProperties.NODE_TYPE)); - json.addProperty("url", this.urlBuilder.pathed(v)); - Optional properties = this.createPropertiesObject(v); - if (properties.isPresent()) { - json.add("properties", properties.get()); - } else { - return Optional.empty(); - } - if (!nodesOnly) { - json.add("related-to", this.createRelationshipObject(v)); - } - return Optional.of(json); - } + @Override + public int parallelThreshold() { + return 100; + } + + public Optional createPropertiesObject(Vertex v) throws AAIFormatVertexException { + JsonObject json = new JsonObject(); + Iterator> iter = v.properties(); + + while (iter.hasNext()) { + VertexProperty prop = iter.next(); + if (prop.value() instanceof String) { + json.addProperty(prop.key(), (String) prop.value()); + } else if (prop.value() instanceof Boolean) { + json.addProperty(prop.key(), (Boolean) prop.value()); + } else if (prop.value() instanceof Number) { + json.addProperty(prop.key(), (Number) prop.value()); + } else if (prop.value() instanceof List) { + Gson gson = new Gson(); + String list = gson.toJson(prop.value()); + + json.addProperty(prop.key(), list); + } else { + // throw exception? + return null; + } + } + + return Optional.of(json); + } + + protected JsonArray createRelationshipObject(Vertex v) throws AAIFormatVertexException { + JsonArray jarray = new JsonArray(); + Iterator inIter = v.edges(Direction.IN); + Iterator outIter = v.edges(Direction.OUT); + + while (inIter.hasNext()) { + Edge e = inIter.next(); + Vertex outVertex = e.outVertex(); + this.addEdge(e, outVertex, jarray); + } + + while (outIter.hasNext()) { + Edge e = outIter.next(); + Vertex inVertex = e.inVertex(); + this.addEdge(e, inVertex, jarray); + } + + return jarray; + } + + protected void addEdge(Edge e, Vertex vertex, JsonArray array) throws AAIFormatVertexException { + array.add(this.getRelatedObject(e.label(), vertex)); + } + + protected JsonObject getRelatedObject(String label, Vertex related) throws AAIFormatVertexException { + JsonObject json = new JsonObject(); + json.addProperty("id", related.id().toString()); + json.addProperty("relationship-label", label); + json.addProperty("node-type", related.value(AAIProperties.NODE_TYPE)); + json.addProperty("url", this.urlBuilder.pathed(related)); + + return json; + } + + public static class Builder implements NodesOnly, Depth { + + protected final Loader loader; + protected final DBSerializer serializer; + protected final UrlBuilder urlBuilder; + protected boolean includeUrl = false; + protected boolean nodesOnly = false; + protected int depth = 1; + protected boolean modelDriven = false; + + public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) { + this.loader = loader; + this.serializer = serializer; + this.urlBuilder = urlBuilder; + } + + protected Loader getLoader() { + return this.loader; + } + + protected DBSerializer getSerializer() { + return this.serializer; + } + + protected UrlBuilder getUrlBuilder() { + return this.urlBuilder; + } + + public Builder includeUrl() { + this.includeUrl = true; + return this; + } + + public Builder nodesOnly(Boolean nodesOnly) { + this.nodesOnly = nodesOnly; + return this; + } + + public boolean isNodesOnly() { + return this.nodesOnly; + } + + public Builder depth(Integer depth) { + this.depth = depth; + return this; + } + + public int getDepth() { + return this.depth; + } + + public boolean isIncludeUrl() { + return this.includeUrl; + } + + public Builder modelDriven() { + this.modelDriven = true; + return this; + } + + public boolean getModelDriven() { + return this.modelDriven; + } + + public RawFormat build() { + if (modelDriven) { + return new SimpleFormat(this); + } else { + return new RawFormat(this); + } + } + } + + @Override + protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + + JsonObject json = new JsonObject(); + json.addProperty("id", v.id().toString()); + json.addProperty("node-type", v.value(AAIProperties.NODE_TYPE)); + json.addProperty("url", this.urlBuilder.pathed(v)); + Optional properties = this.createPropertiesObject(v); + if (properties.isPresent()) { + json.add("properties", properties.get()); + } else { + return Optional.empty(); + } + if (!nodesOnly) { + json.add("related-to", this.createRelationshipObject(v)); + } + return Optional.of(json); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java index 3a4fdf89..b92f5858 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java @@ -17,10 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; import com.google.gson.JsonParser; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.db.props.AAIProperties; import org.onap.aai.exceptions.AAIException; @@ -33,132 +40,140 @@ import org.onap.aai.serialization.queryformats.params.Depth; import org.onap.aai.serialization.queryformats.params.NodesOnly; import org.onap.aai.serialization.queryformats.utils.UrlBuilder; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - public class Resource extends MultiFormatMapper { - private final Loader loader; - private final DBSerializer serializer; - private final JsonParser parser; - private final UrlBuilder urlBuilder; - private final boolean includeUrl; - private final boolean nodesOnly; - private final int depth; - private Resource (Builder builder) { - this.parser = new JsonParser(); - this.loader = builder.getLoader(); - this.serializer = builder.getSerializer(); - this.urlBuilder = builder.getUrlBuilder(); - this.includeUrl = builder.isIncludeUrl(); - this.nodesOnly = builder.isNodesOnly(); - this.depth = builder.getDepth(); - } - - @Override - protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { - - JsonObject json = new JsonObject(); - - if (this.includeUrl) { - json.addProperty("url", this.urlBuilder.pathed(v)); - } - Optional jsonObject = this.vertexToJsonObject(v); - if (jsonObject.isPresent()) { - json.add(v.property(AAIProperties.NODE_TYPE).orElse(null), jsonObject.get()); - } else { - return Optional.empty(); - } - return Optional.of(json); - } - - protected Optional vertexToJsonObject(Vertex v) throws AAIFormatVertexException { - try { - final Introspector obj = getLoader().introspectorFromName( - v.property(AAIProperties.NODE_TYPE) - .orElse(null) - ); - - final List wrapper = new ArrayList<>(); - - wrapper.add(v); - - try { - getSerializer().dbToObject(wrapper, obj, this.depth, this.nodesOnly, "false"); - } catch (AAIException | UnsupportedEncodingException e) { - throw new AAIFormatVertexException("Failed to format vertex - error while serializing: " + e.getMessage(), e); - } - - final String json = obj.marshal(false); - - return Optional.of(getParser().parse(json).getAsJsonObject()); - } catch (AAIUnknownObjectException e) { - return Optional.empty(); - } - } - - @Override - public int parallelThreshold() { - return 20; - } - - private Loader getLoader() { return loader; } - private DBSerializer getSerializer() { return serializer; } - private JsonParser getParser() { return parser; } - - public static class Builder implements NodesOnly, Depth { - - private final Loader loader; - private final DBSerializer serializer; - private final UrlBuilder urlBuilder; - private boolean includeUrl = false; - private boolean nodesOnly = false; - private int depth = 1; - public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) { - this.loader = loader; - this.serializer = serializer; - this.urlBuilder = urlBuilder; - } - - protected Loader getLoader() { - return this.loader; - } - - protected DBSerializer getSerializer() { - return this.serializer; - } - - protected UrlBuilder getUrlBuilder() { - return this.urlBuilder; - } - - public Builder includeUrl() { - this.includeUrl = true; - return this; - } - - public Builder nodesOnly(Boolean nodesOnly) { - this.nodesOnly = nodesOnly; - return this; - } - public boolean isNodesOnly() { - return this.nodesOnly; - } - public Builder depth(Integer depth) { - this.depth = depth; - return this; - } - public int getDepth() { - return this.depth; - } - public boolean isIncludeUrl() { - return this.includeUrl; - } - - public Resource build() { - return new Resource(this); - } - } + private final Loader loader; + private final DBSerializer serializer; + private final JsonParser parser; + private final UrlBuilder urlBuilder; + private final boolean includeUrl; + private final boolean nodesOnly; + private final int depth; + + private Resource(Builder builder) { + this.parser = new JsonParser(); + this.loader = builder.getLoader(); + this.serializer = builder.getSerializer(); + this.urlBuilder = builder.getUrlBuilder(); + this.includeUrl = builder.isIncludeUrl(); + this.nodesOnly = builder.isNodesOnly(); + this.depth = builder.getDepth(); + } + + @Override + protected Optional getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + + JsonObject json = new JsonObject(); + + if (this.includeUrl) { + json.addProperty("url", this.urlBuilder.pathed(v)); + } + Optional jsonObject = this.vertexToJsonObject(v); + if (jsonObject.isPresent()) { + json.add(v.property(AAIProperties.NODE_TYPE).orElse(null), jsonObject.get()); + } else { + return Optional.empty(); + } + return Optional.of(json); + } + + protected Optional vertexToJsonObject(Vertex v) throws AAIFormatVertexException { + try { + final Introspector obj = + getLoader().introspectorFromName(v.property(AAIProperties.NODE_TYPE).orElse(null)); + + final List wrapper = new ArrayList<>(); + + wrapper.add(v); + + try { + getSerializer().dbToObject(wrapper, obj, this.depth, this.nodesOnly, "false"); + } catch (AAIException | UnsupportedEncodingException e) { + throw new AAIFormatVertexException( + "Failed to format vertex - error while serializing: " + e.getMessage(), e); + } + + final String json = obj.marshal(false); + + return Optional.of(getParser().parse(json).getAsJsonObject()); + } catch (AAIUnknownObjectException e) { + return Optional.empty(); + } + } + + @Override + public int parallelThreshold() { + return 20; + } + + private Loader getLoader() { + return loader; + } + + private DBSerializer getSerializer() { + return serializer; + } + + private JsonParser getParser() { + return parser; + } + + public static class Builder implements NodesOnly, Depth { + + private final Loader loader; + private final DBSerializer serializer; + private final UrlBuilder urlBuilder; + private boolean includeUrl = false; + private boolean nodesOnly = false; + private int depth = 1; + + public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) { + this.loader = loader; + this.serializer = serializer; + this.urlBuilder = urlBuilder; + } + + protected Loader getLoader() { + return this.loader; + } + + protected DBSerializer getSerializer() { + return this.serializer; + } + + protected UrlBuilder getUrlBuilder() { + return this.urlBuilder; + } + + public Builder includeUrl() { + this.includeUrl = true; + return this; + } + + public Builder nodesOnly(Boolean nodesOnly) { + this.nodesOnly = nodesOnly; + return this; + } + + public boolean isNodesOnly() { + return this.nodesOnly; + } + + public Builder depth(Integer depth) { + this.depth = depth; + return this; + } + + public int getDepth() { + return this.depth; + } + + public boolean isIncludeUrl() { + return this.includeUrl; + } + + public Resource build() { + return new Resource(this); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/ResourceWithSoT.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/ResourceWithSoT.java index 503f3a58..e4107aa9 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/ResourceWithSoT.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/ResourceWithSoT.java @@ -17,10 +17,14 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonObject; import com.google.gson.JsonParser; + +import java.util.Optional; + import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.db.props.AAIProperties; import org.onap.aai.introspection.Loader; @@ -31,8 +35,6 @@ import org.onap.aai.serialization.queryformats.params.NodesOnly; import org.onap.aai.serialization.queryformats.utils.UrlBuilder; import org.onap.aai.util.AAIConfig; -import java.util.Optional; - public class ResourceWithSoT extends MultiFormatMapper { protected JsonParser parser = new JsonParser(); protected final DBSerializer serializer; @@ -40,6 +42,7 @@ public class ResourceWithSoT extends MultiFormatMapper { protected final UrlBuilder urlBuilder; protected final int depth; protected final boolean nodesOnly; + protected ResourceWithSoT(Builder builder) { this.urlBuilder = builder.getUrlBuilder(); this.loader = builder.getLoader(); @@ -62,6 +65,7 @@ public class ResourceWithSoT extends MultiFormatMapper { protected boolean nodesOnly = false; protected int depth = 1; protected boolean modelDriven = false; + public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) { this.loader = loader; this.serializer = serializer; @@ -89,6 +93,7 @@ public class ResourceWithSoT extends MultiFormatMapper { this.nodesOnly = nodesOnly; return this; } + public boolean isNodesOnly() { return this.nodesOnly; } @@ -114,6 +119,7 @@ public class ResourceWithSoT extends MultiFormatMapper { public boolean getModelDriven() { return this.modelDriven; } + public ResourceWithSoT build() { return new ResourceWithSoT(this); } @@ -122,7 +128,8 @@ public class ResourceWithSoT extends MultiFormatMapper { /** * * Returns an Optional to convert the contents from the given Vertex object into a JsonObject. - * The fields returned are to record the time stamp of the creation/modification of the object, the user responsible for + * The fields returned are to record the time stamp of the creation/modification of the object, the user responsible + * for * the change, and the last http method performed on the object. * * @param v @@ -151,8 +158,10 @@ public class ResourceWithSoT extends MultiFormatMapper { json.addProperty("source-of-truth", sotObj.toString()); json.addProperty("last-mod-source-of-truth", lastModSotObj.toString()); - // Check if the timestamp difference between creation and last modification are greater than a certain threshold, and if the source of truth differs - // If the timestamp difference is marginal and the SoT (creator/modifier) is the same, the last action performed is likely to be a creation. + // Check if the timestamp difference between creation and last modification are greater than a certain + // threshold, and if the source of truth differs + // If the timestamp difference is marginal and the SoT (creator/modifier) is the same, the last action performed + // is likely to be a creation. long timestampDiff = lastModifiedTimestamp - createdTimestamp; boolean isSameSoT = sotObj.toString().equals(lastModSotObj.toString()); diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java index c9d3a026..f1d1c26e 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java @@ -17,10 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; import com.google.gson.JsonArray; import com.google.gson.JsonObject; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -30,62 +37,54 @@ import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - public class SimpleFormat extends RawFormat { + protected SimpleFormat(Builder builder) { + super(builder); + + } + + @Override + public int parallelThreshold() { + return 20; + } + + @Override + public Optional createPropertiesObject(Vertex v) throws AAIFormatVertexException { + try { + final Introspector obj = + loader.introspectorFromName(v.property(AAIProperties.NODE_TYPE).orElse(null)); + + final List wrapper = new ArrayList<>(); + + wrapper.add(v); + + try { + serializer.dbToObject(wrapper, obj, this.depth, true, "false"); + } catch (AAIException | UnsupportedEncodingException e) { + throw new AAIFormatVertexException( + "Failed to format vertex - error while serializing: " + e.getMessage(), e); + } + + final String json = obj.marshal(false); + return Optional.of(parser.parse(json).getAsJsonObject()); + } catch (AAIUnknownObjectException e) { + return Optional.empty(); + } + + } + + @Override + protected void addEdge(Edge e, Vertex v, JsonArray array) throws AAIFormatVertexException { + + Property property = e.property("private"); + + if (property.isPresent()) { + if ("true".equals(e.property("private").value().toString())) { + return; + } + } - protected SimpleFormat(Builder builder) { - super(builder); - - } - - @Override - public int parallelThreshold() { - return 20; - } - - @Override - public Optional createPropertiesObject(Vertex v) throws AAIFormatVertexException { - try { - final Introspector obj = loader.introspectorFromName( - v.property(AAIProperties.NODE_TYPE) - .orElse(null) - ); - - final List wrapper = new ArrayList<>(); - - wrapper.add(v); - - try { - serializer.dbToObject(wrapper, obj, this.depth, true, "false"); - } catch (AAIException | UnsupportedEncodingException e) { - throw new AAIFormatVertexException("Failed to format vertex - error while serializing: " + e.getMessage(), e); - } - - final String json = obj.marshal(false); - return Optional.of(parser.parse(json).getAsJsonObject()); - } catch (AAIUnknownObjectException e) { - return Optional.empty(); - } - - - } - - @Override - protected void addEdge(Edge e, Vertex v, JsonArray array) throws AAIFormatVertexException { - - Property property = e.property("private"); - - if(property.isPresent()){ - if("true".equals(e.property("private").value().toString())){ - return; - } - } - - super.addEdge(e, v, array); - } + super.addEdge(e, v, array); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java index 95cbbf43..fb2e624c 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java @@ -17,10 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats; public enum SubGraphStyle { - star, - prune, - no_op + star, prune, no_op } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatQueryResultFormatNotSupported.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatQueryResultFormatNotSupported.java index 9d79330f..add62644 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatQueryResultFormatNotSupported.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatQueryResultFormatNotSupported.java @@ -17,23 +17,25 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.exceptions; public class AAIFormatQueryResultFormatNotSupported extends Exception { - private static final long serialVersionUID = -5814240842844624097L; + private static final long serialVersionUID = -5814240842844624097L; - public AAIFormatQueryResultFormatNotSupported() {} + public AAIFormatQueryResultFormatNotSupported() { + } - public AAIFormatQueryResultFormatNotSupported(String message) { - super(message); - } + public AAIFormatQueryResultFormatNotSupported(String message) { + super(message); + } - public AAIFormatQueryResultFormatNotSupported(Throwable cause) { - super(cause); - } + public AAIFormatQueryResultFormatNotSupported(Throwable cause) { + super(cause); + } - public AAIFormatQueryResultFormatNotSupported(String message, Throwable cause) { - super(message, cause); - } + public AAIFormatQueryResultFormatNotSupported(String message, Throwable cause) { + super(message, cause); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java index 108a9c8d..9c5f92a6 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java @@ -17,23 +17,25 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.exceptions; public class AAIFormatVertexException extends Exception { - private static final long serialVersionUID = -5814240841844624097L; + private static final long serialVersionUID = -5814240841844624097L; - public AAIFormatVertexException() {} + public AAIFormatVertexException() { + } - public AAIFormatVertexException(String message) { - super(message); - } + public AAIFormatVertexException(String message) { + super(message); + } - public AAIFormatVertexException(Throwable cause) { - super(cause); - } + public AAIFormatVertexException(Throwable cause) { + super(cause); + } - public AAIFormatVertexException(String message, Throwable cause) { - super(message, cause); - } + public AAIFormatVertexException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java index 31b0a573..58e60e61 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java @@ -17,23 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.exceptions; import org.onap.aai.exceptions.AAIException; public class QueryParamInjectionException extends AAIException { - private static final long serialVersionUID = -5575661036426538012L; + private static final long serialVersionUID = -5575661036426538012L; - public QueryParamInjectionException(String message) { - super("AAI_4017", message); - } + public QueryParamInjectionException(String message) { + super("AAI_4017", message); + } - public QueryParamInjectionException(Throwable cause) { - super("AAI_4017",cause); - } + public QueryParamInjectionException(Throwable cause) { + super("AAI_4017", cause); + } - public QueryParamInjectionException(String message, Throwable cause) { - super("AAI_4017", cause, message); - } + public QueryParamInjectionException(String message, Throwable cause) { + super("AAI_4017", cause, message); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java index de485fe3..c8dea517 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java @@ -17,11 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.params; @Inject(name = "depth") public interface Depth { - @Setter - public T depth(Integer depth); + @Setter + public T depth(Integer depth); } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java index 6a1ff42e..bccbd11a 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.params; import java.lang.annotation.Retention; @@ -25,9 +26,10 @@ import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface Inject { - /** - * The way the query parameter appears in the URI - * @return - */ - String name(); + /** + * The way the query parameter appears in the URI + * + * @return + */ + String name(); } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java index f0fa5da0..f909cd2b 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java @@ -17,11 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.params; @Inject(name = "nodesOnly") public interface NodesOnly { - @Setter - public T nodesOnly(Boolean nodesOnly); + @Setter + public T nodesOnly(Boolean nodesOnly); } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java index f760391d..327b2c11 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.params; import java.lang.annotation.ElementType; diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java index e3976133..1b51088e 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.utils; import java.lang.reflect.InvocationTargetException; @@ -32,52 +33,49 @@ import org.reflections.Reflections; public class QueryParamInjector { - private final Set> results; - - - private QueryParamInjector () { - Reflections reflections = new Reflections("org.onap.aai.serialization.queryformats.params"); - results = reflections.getTypesAnnotatedWith(Inject.class); - } - - private static class Helper { - private static final QueryParamInjector INSTANCE = new QueryParamInjector(); - } - - public static QueryParamInjector getInstance() { - return Helper.INSTANCE; - } - - public T injectParams(T obj, MultivaluedMap params) throws QueryParamInjectionException{ - try { - for (Class item : results) { - if (item.isAssignableFrom(obj.getClass())) { - String name = item.getAnnotation(Inject.class).name(); - - if (params.containsKey(name)) { - String value = params.getFirst(name); - - for (Method method : item.getMethods()) { - if (method.isAnnotationPresent(Setter.class)) { - Class[] args = method.getParameterTypes(); - if (args.length == 1) { - Object o = args[0].getConstructor(String.class).newInstance(value); - method.invoke(obj, o); - } else { - method.invoke(obj); - } - } - } - } - } - } - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException | NoSuchMethodException - | SecurityException e) { - throw new QueryParamInjectionException("issue with query params", e); - } - - - return obj; - } + private final Set> results; + + private QueryParamInjector() { + Reflections reflections = new Reflections("org.onap.aai.serialization.queryformats.params"); + results = reflections.getTypesAnnotatedWith(Inject.class); + } + + private static class Helper { + private static final QueryParamInjector INSTANCE = new QueryParamInjector(); + } + + public static QueryParamInjector getInstance() { + return Helper.INSTANCE; + } + + public T injectParams(T obj, MultivaluedMap params) throws QueryParamInjectionException { + try { + for (Class item : results) { + if (item.isAssignableFrom(obj.getClass())) { + String name = item.getAnnotation(Inject.class).name(); + + if (params.containsKey(name)) { + String value = params.getFirst(name); + + for (Method method : item.getMethods()) { + if (method.isAnnotationPresent(Setter.class)) { + Class[] args = method.getParameterTypes(); + if (args.length == 1) { + Object o = args[0].getConstructor(String.class).newInstance(value); + method.invoke(obj, o); + } else { + method.invoke(obj); + } + } + } + } + } + } + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + throw new QueryParamInjectionException("issue with query params", e); + } + + return obj; + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java index 30459364..9da82fe0 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.queryformats.utils; import java.io.UnsupportedEncodingException; @@ -24,80 +25,82 @@ import java.net.URI; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.exceptions.AAIException; -import org.onap.aai.setup.SchemaVersion; import org.onap.aai.serialization.db.DBSerializer; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException; +import org.onap.aai.setup.SchemaVersion; import org.onap.aai.setup.SchemaVersions; import org.onap.aai.util.AAIConfig; import org.onap.aai.util.AAIConstants; public class UrlBuilder { - private final DBSerializer serializer; - private final SchemaVersion version; - private final String serverBase; - private final SchemaVersions schemaVersions; - private final String basePath; + private final DBSerializer serializer; + private final SchemaVersion version; + private final String serverBase; + private final SchemaVersions schemaVersions; + private final String basePath; + + public UrlBuilder(SchemaVersion version, DBSerializer serializer, SchemaVersions schemaVersions, String basePath) + throws AAIException { + this.serializer = serializer; + this.version = version; + this.serverBase = this.getServerBase(); + this.schemaVersions = schemaVersions; + if (!basePath.endsWith("/")) { + this.basePath = basePath + "/"; + } else { + this.basePath = basePath; + } + } + + public UrlBuilder(SchemaVersion version, DBSerializer serializer, String serverBase, SchemaVersions schemaVersions, + String basePath) { + this.serializer = serializer; + this.version = version; + this.serverBase = serverBase; + this.schemaVersions = schemaVersions; + if (!basePath.endsWith("/")) { + this.basePath = basePath + "/"; + } else { + this.basePath = basePath; + } + } + + public String pathed(Vertex v) throws AAIFormatVertexException { + + try { + final StringBuilder result = new StringBuilder(); + final URI uri = this.serializer.getURIForVertex(v); + + if (this.version.compareTo(schemaVersions.getAppRootVersion()) >= 0) { + result.append(basePath); + } else { + result.append(this.serverBase); + } + result.append(this.version); + result.append(uri.getRawPath()); - public UrlBuilder (SchemaVersion version, DBSerializer serializer, SchemaVersions schemaVersions, String basePath) throws AAIException { - this.serializer = serializer; - this.version = version; - this.serverBase = this.getServerBase(); - this.schemaVersions = schemaVersions; - if(!basePath.endsWith("/")){ - this.basePath = basePath + "/"; - } else { - this.basePath = basePath; - } - } - - public UrlBuilder (SchemaVersion version, DBSerializer serializer, String serverBase, SchemaVersions schemaVersions, String basePath) { - this.serializer = serializer; - this.version = version; - this.serverBase = serverBase; - this.schemaVersions = schemaVersions; - if(!basePath.endsWith("/")){ - this.basePath = basePath + "/"; - } else { - this.basePath = basePath; - } - } - - public String pathed(Vertex v) throws AAIFormatVertexException { + return result.toString(); + } catch (UnsupportedEncodingException | IllegalArgumentException | SecurityException e) { + throw new AAIFormatVertexException(e); + } + } - try { - final StringBuilder result = new StringBuilder(); - final URI uri = this.serializer.getURIForVertex(v); + public String id(Vertex v) { + final StringBuilder result = new StringBuilder(); - if (this.version.compareTo(schemaVersions.getAppRootVersion()) >= 0) { - result.append(basePath); - } else { - result.append(this.serverBase); - } - result.append(this.version); - result.append(uri.getRawPath()); - - return result.toString(); - } catch (UnsupportedEncodingException | IllegalArgumentException | SecurityException e) { - throw new AAIFormatVertexException(e); - } - } - - public String id(Vertex v) { - final StringBuilder result = new StringBuilder(); + result.append("/resources/id/" + v.id()); + result.insert(0, this.version); + if (this.version.compareTo(schemaVersions.getAppRootVersion()) >= 0) { + result.insert(0, basePath); + } else { + result.insert(0, this.serverBase); + } - result.append("/resources/id/" + v.id()); - result.insert(0, this.version); - if (this.version.compareTo(schemaVersions.getAppRootVersion()) >= 0) { - result.insert(0, basePath); - } else { - result.insert(0, this.serverBase); - } + return result.toString(); + } - return result.toString(); - } - - protected String getServerBase() throws AAIException { - return AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE); - } + protected String getServerBase() throws AAIException { + return AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE); + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedEdge.java b/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedEdge.java index 09abfb11..50174d03 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedEdge.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedEdge.java @@ -17,8 +17,11 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.serialization.tinkerpop; +import java.util.Iterator; + import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; @@ -26,54 +29,49 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; -import java.util.Iterator; - - /** - * Represents a {@link Edge} that is disconnected from a {@link Graph} however, + * Represents a {@link Edge} that is disconnected from a {@link Graph} however, * traversals are supported as they are backed by a Tree with saturated {@link Vertex} and {@link Edge} objects. * These objects are not mutable and can only be used to read information out. * */ public class TreeBackedEdge extends DetachedEdge implements Edge { - private static final long serialVersionUID = 5419650145562077538L; - private TreeBackedVertex inVertex; - private TreeBackedVertex outVertex; - public TreeBackedEdge(Edge edge, TreeBackedVertex inVertex, TreeBackedVertex outVertex) { - super(edge, true); - this.inVertex = inVertex; - this.outVertex = outVertex; - } - - @Override - public Vertex inVertex() { - return this.inVertex; - } - - @Override - public Vertex outVertex() { - return this.outVertex; - } - - @Override - public Iterator bothVertices() { - return this.vertices(Direction.BOTH); - } - - @Override - public Iterator vertices(Direction direction) { - switch (direction) { - case OUT: - return IteratorUtils.of(this.outVertex); - case IN: - return IteratorUtils.of(this.inVertex); - default: - return IteratorUtils.of(this.outVertex, this.inVertex); - } - } + private static final long serialVersionUID = 5419650145562077538L; + private TreeBackedVertex inVertex; + private TreeBackedVertex outVertex; + + public TreeBackedEdge(Edge edge, TreeBackedVertex inVertex, TreeBackedVertex outVertex) { + super(edge, true); + this.inVertex = inVertex; + this.outVertex = outVertex; + } + + @Override + public Vertex inVertex() { + return this.inVertex; + } + + @Override + public Vertex outVertex() { + return this.outVertex; + } + @Override + public Iterator bothVertices() { + return this.vertices(Direction.BOTH); + } - + @Override + public Iterator vertices(Direction direction) { + switch (direction) { + case OUT: + return IteratorUtils.of(this.outVertex); + case IN: + return IteratorUtils.of(this.inVertex); + default: + return IteratorUtils.of(this.outVertex, this.inVertex); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedVertex.java b/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedVertex.java index 62a45894..c2856a77 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedVertex.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/tinkerpop/TreeBackedVertex.java @@ -17,19 +17,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.serialization.tinkerpop; -import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; -import org.apache.tinkerpop.gremlin.structure.*; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; +package org.onap.aai.serialization.tinkerpop; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; +import org.apache.tinkerpop.gremlin.structure.*; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; + /** - * Represents a {@link Vertex} that is disconnected from a {@link Graph} however, + * Represents a {@link Vertex} that is disconnected from a {@link Graph} however, * traversals are supported as they are backed by a Tree with saturated {@link Vertex} and {@link Edge} objects. * These objects are not mutable and can only be used to read information out. * @@ -37,125 +38,127 @@ import java.util.List; public class TreeBackedVertex extends DetachedVertex implements Vertex { - private static final long serialVersionUID = -976854460992756953L; - private final Tree tree; - private final Vertex self; - public TreeBackedVertex (Vertex v, Tree tree) { - super(v, true); - this.self = v; - this.tree = tree; - } - - @Override + private static final long serialVersionUID = -976854460992756953L; + private final Tree tree; + private final Vertex self; + + public TreeBackedVertex(Vertex v, Tree tree) { + super(v, true); + this.self = v; + this.tree = tree; + } + + @Override public Iterator edges(final Direction direction, final String... edgeLabels) { - final List edges = tree.getObjectsAtDepth(2); - final List> trees = tree.getTreesAtDepth(2); - final List> vTrees = tree.getTreesAtDepth(3); - return edges.stream().map( ele -> (Edge)ele).filter(e -> { - if (Direction.IN.equals(direction)) { - return e.inVertex().equals(self); - } else if (Direction.OUT.equals(direction)) { - return e.outVertex().equals(self); - } else { - return true; - } - }).filter(e -> { - boolean result = false; - if (edgeLabels.length == 0) { - return true; - } - for (String label : edgeLabels) { - if (label.equals(e.label())) { - result = true; - break; - } - } - return result; - }).map(e -> { - Tree eTree = new Tree<>(); - for (Tree tree : trees) { - if (tree.keySet().contains(e)) { - eTree = tree; - break; - } - } - TreeBackedVertex in = null; - TreeBackedVertex out = null; - if (e.inVertex().equals(self)) { - in = this; - out = this.createForVertex(e.outVertex(), vTrees); - } else if (e.outVertex().equals(self)) { - out = this; - in = this.createForVertex(e.inVertex(), vTrees); - } - return (Edge)new TreeBackedEdge(e, in, out); - }).iterator(); + final List edges = tree.getObjectsAtDepth(2); + final List> trees = tree.getTreesAtDepth(2); + final List> vTrees = tree.getTreesAtDepth(3); + return edges.stream().map(ele -> (Edge) ele).filter(e -> { + if (Direction.IN.equals(direction)) { + return e.inVertex().equals(self); + } else if (Direction.OUT.equals(direction)) { + return e.outVertex().equals(self); + } else { + return true; + } + }).filter(e -> { + boolean result = false; + if (edgeLabels.length == 0) { + return true; + } + for (String label : edgeLabels) { + if (label.equals(e.label())) { + result = true; + break; + } + } + return result; + }).map(e -> { + Tree eTree = new Tree<>(); + for (Tree tree : trees) { + if (tree.keySet().contains(e)) { + eTree = tree; + break; + } + } + TreeBackedVertex in = null; + TreeBackedVertex out = null; + if (e.inVertex().equals(self)) { + in = this; + out = this.createForVertex(e.outVertex(), vTrees); + } else if (e.outVertex().equals(self)) { + out = this; + in = this.createForVertex(e.inVertex(), vTrees); + } + return (Edge) new TreeBackedEdge(e, in, out); + }).iterator(); + + } + + private TreeBackedVertex createForVertex(Vertex v, List> trees) { + Tree vTree = new Tree<>(); + for (Tree tree : trees) { + if (tree.keySet().contains(v)) { + vTree = tree; + break; + } + } + return new TreeBackedVertex((Vertex) vTree.keySet().iterator().next(), vTree); } - - private TreeBackedVertex createForVertex(Vertex v, List> trees) { - Tree vTree = new Tree<>(); - for (Tree tree : trees) { - if (tree.keySet().contains(v)) { - vTree = tree; - break; - } - } - - return new TreeBackedVertex((Vertex)vTree.keySet().iterator().next(), vTree); - } + @Override public Iterator vertices(final Direction direction, final String... labels) { - final List> vertexElements = tree.getTreesAtDepth(3); - final List edgeElements = tree.getObjectsAtDepth(2); - return edgeElements.stream().map( ele -> (Edge)ele).filter(e -> { - boolean result = false; - if (labels.length == 0) { - return true; - } - for (String label : labels) { - if (label.equals(e.label())) { - result = true; - break; - } - } - return result; - }).filter(e -> { - if (Direction.IN.equals(direction) && e.inVertex().equals(self)) { - return true; - } else if (Direction.OUT.equals(direction) && e.outVertex().equals(self)) { - return true; - } else if (Direction.BOTH.equals(direction)){ - return true; - } else { - return false; - } - }).map(e -> { - final List list; - if (Direction.IN.equals(direction)) { - list = Collections.singletonList(e.outVertex()); - } else if (Direction.OUT.equals(direction)){ - list = Collections.singletonList(e.inVertex()); - } else { - list = new ArrayList<>(); - Iterator itr = e.bothVertices(); - while (itr.hasNext()) { - list.add(itr.next()); - } - } - return list; - - }).flatMap(list -> list.stream()).map(v -> { - Tree vTree = new Tree(); - for (Tree tree : vertexElements) { - if (tree.keySet().contains(v)) { - vTree = tree; - break; - } - } - - return (Vertex)new TreeBackedVertex(v, vTree); - }).iterator(); - } - + final List> vertexElements = tree.getTreesAtDepth(3); + final List edgeElements = tree.getObjectsAtDepth(2); + return edgeElements.stream().map(ele -> (Edge) ele).filter(e -> { + boolean result = false; + if (labels.length == 0) { + return true; + } + for (String label : labels) { + if (label.equals(e.label())) { + result = true; + break; + } + } + return result; + }).filter(e -> { + if (Direction.IN.equals(direction) && e.inVertex().equals(self)) { + return true; + } else if (Direction.OUT.equals(direction) && e.outVertex().equals(self)) { + return true; + } else if (Direction.BOTH.equals(direction)) { + return true; + } else { + return false; + } + }).map(e -> { + final List list; + if (Direction.IN.equals(direction)) { + list = Collections.singletonList(e.outVertex()); + } else if (Direction.OUT.equals(direction)) { + list = Collections.singletonList(e.inVertex()); + } else { + list = new ArrayList<>(); + Iterator itr = e.bothVertices(); + while (itr.hasNext()) { + list.add(itr.next()); + } + } + return list; + + }).flatMap(list -> list.stream()).map(v -> { + Tree vTree = new Tree(); + for (Tree tree : vertexElements) { + if (tree.keySet().contains(v)) { + vTree = tree; + break; + } + } + + return (Vertex) new TreeBackedVertex(v, vTree); + }).iterator(); + } + } diff --git a/aai-core/src/main/java/org/onap/aai/service/NodeValidationService.java b/aai-core/src/main/java/org/onap/aai/service/NodeValidationService.java index c7ef769b..316e3017 100644 --- a/aai-core/src/main/java/org/onap/aai/service/NodeValidationService.java +++ b/aai-core/src/main/java/org/onap/aai/service/NodeValidationService.java @@ -17,18 +17,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.service; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; + +import javax.annotation.PostConstruct; + import org.onap.aai.validation.nodes.NodeValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; - @Service @ConditionalOnProperty(name = "schema.translator.list", havingValue = "config", matchIfMissing = true) @PropertySource(value = "classpath:schema-ingest.properties", ignoreResourceNotFound = true) @@ -37,20 +39,19 @@ public class NodeValidationService { private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(NodeValidationService.class); - @Autowired(required=false) + @Autowired(required = false) private NodeValidator nodeValidator; - public NodeValidationService(NodeValidator nodeValidator){ + public NodeValidationService(NodeValidator nodeValidator) { this.nodeValidator = nodeValidator; } @PostConstruct - public void initialize(){ - if(!nodeValidator.validate()){ + public void initialize() { + if (!nodeValidator.validate()) { LOGGER.warn(nodeValidator.getErrorMsg()); } else { LOGGER.info("Node validation check passed"); } } } - diff --git a/aai-core/src/main/java/org/onap/aai/tasks/ScheduledTasks.java b/aai-core/src/main/java/org/onap/aai/tasks/ScheduledTasks.java index 81c81f55..911603d2 100644 --- a/aai-core/src/main/java/org/onap/aai/tasks/ScheduledTasks.java +++ b/aai-core/src/main/java/org/onap/aai/tasks/ScheduledTasks.java @@ -17,8 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.tasks; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.File; import java.util.Arrays; import java.util.Date; @@ -26,73 +30,70 @@ import java.util.UUID; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.comparator.LastModifiedFileComparator; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - import org.onap.aai.logging.LoggingContext; import org.onap.aai.logging.LoggingContext.StatusCode; import org.onap.aai.util.AAIConfig; import org.onap.aai.util.AAIConstants; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; @Component public class ScheduledTasks { - private static EELFLogger LOGGER = EELFManager.getInstance().getLogger(ScheduledTasks.class); + private static EELFLogger LOGGER = EELFManager.getInstance().getLogger(ScheduledTasks.class); - private static final String COMPONENT = "Scheduler"; - private static final String FROM_APP_ID = "CronApp"; - private static final long PROPERTY_READ_INTERVAL = 60000; // every minute + private static final String COMPONENT = "Scheduler"; + private static final String FROM_APP_ID = "CronApp"; + private static final long PROPERTY_READ_INTERVAL = 60000; // every minute - private String GlobalPropFileName = AAIConstants.AAI_CONFIG_FILENAME; + private String GlobalPropFileName = AAIConstants.AAI_CONFIG_FILENAME; - // for read and possibly reloading aaiconfig.properties and other - /** - * Load AAI properties. - */ - // configuration properties files - @Scheduled(fixedRate = PROPERTY_READ_INTERVAL) - public void loadAAIProperties() { - final UUID transId = UUID.randomUUID(); + // for read and possibly reloading aaiconfig.properties and other + /** + * Load AAI properties. + */ + // configuration properties files + @Scheduled(fixedRate = PROPERTY_READ_INTERVAL) + public void loadAAIProperties() { + final UUID transId = UUID.randomUUID(); - //LoggingContext.init(); - LoggingContext.save(); - LoggingContext.requestId(transId); - LoggingContext.partnerName(FROM_APP_ID); - LoggingContext.component(COMPONENT); - LoggingContext.targetEntity("AAI"); - LoggingContext.targetServiceName("loadAAIProperties"); - LoggingContext.serviceName("AAI"); - LoggingContext.statusCode(StatusCode.COMPLETE); - LoggingContext.responseCode(LoggingContext.SUCCESS); + // LoggingContext.init(); + LoggingContext.save(); + LoggingContext.requestId(transId); + LoggingContext.partnerName(FROM_APP_ID); + LoggingContext.component(COMPONENT); + LoggingContext.targetEntity("AAI"); + LoggingContext.targetServiceName("loadAAIProperties"); + LoggingContext.serviceName("AAI"); + LoggingContext.statusCode(StatusCode.COMPLETE); + LoggingContext.responseCode(LoggingContext.SUCCESS); - String dir = FilenameUtils.getFullPathNoEndSeparator(GlobalPropFileName); - if (dir == null || dir.length() < 3) { - dir = "/opt/aai/etc"; - } + String dir = FilenameUtils.getFullPathNoEndSeparator(GlobalPropFileName); + if (dir == null || dir.length() < 3) { + dir = "/opt/aai/etc"; + } - File pdir = new File(dir); - File[] files = pdir.listFiles(); - Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE); - String fn; + File pdir = new File(dir); + File[] files = pdir.listFiles(); + Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE); + String fn; - // leave this loop here since we may want to check other configurable - // property files in the SAME directory - for (File file : files) { - fn = file.getName(); - if (fn.equals("aaiconfig.properties")) { - Date lastMod = new Date(file.lastModified()); - long lastModTm = lastMod.getTime(); - Date curTS = new Date(); - long curTSTm = curTS.getTime(); - if (curTSTm - lastModTm < PROPERTY_READ_INTERVAL + 1000) { - AAIConfig.reloadConfig(); - LOGGER.debug("reloaded from aaiconfig.properties"); - } - break; - } - } - LoggingContext.restoreIfPossible(); - } + // leave this loop here since we may want to check other configurable + // property files in the SAME directory + for (File file : files) { + fn = file.getName(); + if (fn.equals("aaiconfig.properties")) { + Date lastMod = new Date(file.lastModified()); + long lastModTm = lastMod.getTime(); + Date curTS = new Date(); + long curTSTm = curTS.getTime(); + if (curTSTm - lastModTm < PROPERTY_READ_INTERVAL + 1000) { + AAIConfig.reloadConfig(); + LOGGER.debug("reloaded from aaiconfig.properties"); + } + break; + } + } + LoggingContext.restoreIfPossible(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/AAIConfig.java b/aai-core/src/main/java/org/onap/aai/util/AAIConfig.java index 86cb635e..c2103071 100644 --- a/aai-core/src/main/java/org/onap/aai/util/AAIConfig.java +++ b/aai-core/src/main/java/org/onap/aai/util/AAIConfig.java @@ -17,57 +17,57 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.util.Properties; -import org.onap.aai.logging.LoggingContext; -import org.onap.aai.logging.LoggingContext.StatusCode; - import java.util.UUID; import org.eclipse.jetty.util.security.Password; - import org.onap.aai.exceptions.AAIException; import org.onap.aai.logging.ErrorLogHelper; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - +import org.onap.aai.logging.LoggingContext; +import org.onap.aai.logging.LoggingContext.StatusCode; public class AAIConfig { - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIConfig.class); - private static final String GLOBAL_PROP_FILE_NAME = AAIConstants.AAI_CONFIG_FILENAME; - private static Properties serverProps; + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIConfig.class); + private static final String GLOBAL_PROP_FILE_NAME = AAIConstants.AAI_CONFIG_FILENAME; + private static Properties serverProps; private static boolean propsInitialized = false; /** * Instantiates a new AAI config. */ // Don't instantiate - private AAIConfig() {} + private AAIConfig() { + } /** * Inits the. * * @throws AAIException the AAI exception */ - public synchronized static void init() throws AAIException{ + public synchronized static void init() throws AAIException { - LoggingContext.save(); - LoggingContext.component("config"); - LoggingContext.partnerName("NA"); - LoggingContext.targetEntity("AAI"); - LoggingContext.requestId(UUID.randomUUID().toString()); - LoggingContext.serviceName("AAI"); - LoggingContext.targetServiceName("init"); - LoggingContext.statusCode(StatusCode.COMPLETE); + LoggingContext.save(); + LoggingContext.component("config"); + LoggingContext.partnerName("NA"); + LoggingContext.targetEntity("AAI"); + LoggingContext.requestId(UUID.randomUUID().toString()); + LoggingContext.serviceName("AAI"); + LoggingContext.targetServiceName("init"); + LoggingContext.statusCode(StatusCode.COMPLETE); - LOGGER.info("Initializing AAIConfig"); + LOGGER.info("Initializing AAIConfig"); AAIConfig.getConfigFile(); AAIConfig.reloadConfig(); @@ -99,15 +99,15 @@ public class AAIConfig { LOGGER.debug("Reloading config from " + propFileName); - try(InputStream is = new FileInputStream(propFileName)) { + try (InputStream is = new FileInputStream(propFileName)) { newServerProps = new Properties(); newServerProps.load(is); propsInitialized = true; serverProps = newServerProps; } catch (FileNotFoundException fnfe) { - ErrorLogHelper.logError("AAI_4001", " " + propFileName + ". Exception: "+fnfe.getMessage()); + ErrorLogHelper.logError("AAI_4001", " " + propFileName + ". Exception: " + fnfe.getMessage()); } catch (IOException e) { - ErrorLogHelper.logError("AAI_4002", " " + propFileName + ". IOException: "+e.getMessage()); + ErrorLogHelper.logError("AAI_4002", " " + propFileName + ". IOException: " + e.getMessage()); } } @@ -119,15 +119,15 @@ public class AAIConfig { * @return the string */ public static String get(String key, String defaultValue) { - String result = defaultValue; - try { - result = get (key); - } catch ( AAIException a ) { - } - if (result == null || result.isEmpty()) { - result = defaultValue; - } - return ( result ); + String result = defaultValue; + try { + result = get(key); + } catch (AAIException a) { + } + if (result == null || result.isEmpty()) { + result = defaultValue; + } + return (result); } /** @@ -138,36 +138,37 @@ public class AAIConfig { * @throws AAIException the AAI exception */ public static String get(String key) throws AAIException { - String response = null; - - if (key.equals(AAIConstants.AAI_NODENAME)) { - // Get this from InetAddress rather than the properties file - String nodeName = getNodeName(); - if (nodeName != null) { - return nodeName; - } - // else get from property file - } - - if (!propsInitialized || (serverProps == null)) { - reloadConfig(); - } - - if ((key.endsWith("password") || key.endsWith("passwd") || key.endsWith("apisecret")) && serverProps.containsKey(key+".x")) { - String valx = serverProps.getProperty(key+".x"); - return Password.deobfuscate(valx); - } - - if (!serverProps.containsKey(key)) { - throw new AAIException("AAI_4005", "Property key "+key+" cannot be found"); - } else { - response = serverProps.getProperty(key); - if (response == null || response.isEmpty()) { - throw new AAIException("AAI_4005", "Property key "+key+" is null or empty"); - } - } - return response; - } + String response = null; + + if (key.equals(AAIConstants.AAI_NODENAME)) { + // Get this from InetAddress rather than the properties file + String nodeName = getNodeName(); + if (nodeName != null) { + return nodeName; + } + // else get from property file + } + + if (!propsInitialized || (serverProps == null)) { + reloadConfig(); + } + + if ((key.endsWith("password") || key.endsWith("passwd") || key.endsWith("apisecret")) + && serverProps.containsKey(key + ".x")) { + String valx = serverProps.getProperty(key + ".x"); + return Password.deobfuscate(valx); + } + + if (!serverProps.containsKey(key)) { + throw new AAIException("AAI_4005", "Property key " + key + " cannot be found"); + } else { + response = serverProps.getProperty(key); + if (response == null || response.isEmpty()) { + throw new AAIException("AAI_4005", "Property key " + key + " is null or empty"); + } + } + return response; + } /** * Gets the int. @@ -176,9 +177,9 @@ public class AAIConfig { * @return the int * @throws AAIException the AAI exception */ - public static int getInt(String key) throws AAIException{ - return Integer.parseInt(AAIConfig.get(key)); - } + public static int getInt(String key) throws AAIException { + return Integer.parseInt(AAIConfig.get(key)); + } /** * Gets the int. @@ -190,44 +191,42 @@ public class AAIConfig { return Integer.parseInt(AAIConfig.get(key, value)); } - /** - * Gets the server props. - * - * @return the server props - */ - public static Properties getServerProps() { - return serverProps; - } - - /** - * Gets the node name. - * - * @return the node name - */ - public static String getNodeName() { - try { + /** + * Gets the server props. + * + * @return the server props + */ + public static Properties getServerProps() { + return serverProps; + } + + /** + * Gets the node name. + * + * @return the node name + */ + public static String getNodeName() { + try { InetAddress ip = InetAddress.getLocalHost(); if (ip != null) { - String hostname = ip.getHostName(); - if (hostname != null) { - return hostname; - } + String hostname = ip.getHostName(); + if (hostname != null) { + return hostname; + } } - } catch (Exception e) { - return null; - } - return null; - } - - - /** - * Check if a null or an Empty string is passed in. - * - * @param s the s - * @return boolean - */ - public static boolean isEmpty(String s) - { - return (s == null || s.length() == 0); - } + } catch (Exception e) { + return null; + } + return null; + } + + /** + * Check if a null or an Empty string is passed in. + * + * @param s the s + * @return boolean + */ + public static boolean isEmpty(String s) { + return (s == null || s.length() == 0); + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/AAIConfigCommandLinePropGetter.java b/aai-core/src/main/java/org/onap/aai/util/AAIConfigCommandLinePropGetter.java index 8f4b1105..0d894e74 100644 --- a/aai-core/src/main/java/org/onap/aai/util/AAIConfigCommandLinePropGetter.java +++ b/aai-core/src/main/java/org/onap/aai/util/AAIConfigCommandLinePropGetter.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import org.onap.aai.exceptions.AAIException; @@ -32,34 +33,35 @@ import org.onap.aai.exceptions.AAIException; */ public class AAIConfigCommandLinePropGetter { - /** - * The main method. - * - * @param args the arguments - */ - /* - * usage: - * AAIConfigCommandLinePropGetter propertyname - */ - public static void main(String[] args) { - if (args.length != 1) { - // System.out.println("only one property may be requested at a time"); - // System.out.println("usage: AAIConfigCommandLinePropGetter propertyname"); - } - try { - AAIConfig.init(); - String value = AAIConfig.get(args[0]); - if (value != null) { - System.out.println(value); //bc this utility used by a shell script so it needs the result sent to stdout - } else { - System.out.println("requested property could not be found"); - } - } catch(AAIException e) { - //System.out.println("exception:" + e.toString()); //TODO is this reasonable? - } finally { - System.exit(0); - } + /** + * The main method. + * + * @param args the arguments + */ + /* + * usage: + * AAIConfigCommandLinePropGetter propertyname + */ + public static void main(String[] args) { + if (args.length != 1) { + // System.out.println("only one property may be requested at a time"); + // System.out.println("usage: AAIConfigCommandLinePropGetter propertyname"); + } + try { + AAIConfig.init(); + String value = AAIConfig.get(args[0]); + if (value != null) { + System.out.println(value); // bc this utility used by a shell script so it needs the result sent to + // stdout + } else { + System.out.println("requested property could not be found"); + } + } catch (AAIException e) { + // System.out.println("exception:" + e.toString()); //TODO is this reasonable? + } finally { + System.exit(0); + } - } + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/AAIConstants.java b/aai-core/src/main/java/org/onap/aai/util/AAIConstants.java index 59e676f8..e906c280 100644 --- a/aai-core/src/main/java/org/onap/aai/util/AAIConstants.java +++ b/aai-core/src/main/java/org/onap/aai/util/AAIConstants.java @@ -19,6 +19,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; public final class AAIConstants { @@ -26,12 +27,18 @@ public final class AAIConstants { // // /** Default to unix file separator if system property file.separator is null */ - public static final String AAI_FILESEP = (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator"); + public static final String AAI_FILESEP = + (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator"); // /** Default to opt aai if system property aai.home is null, using file.separator */ - public static final String AAI_HOME = (System.getProperty(AJSC_HOME) == null) ? AAI_FILESEP + "opt" + AAI_FILESEP + "app" + AAI_FILESEP +"aai" : System.getProperty(AJSC_HOME); - public static final String AAI_BUNDLECONFIG_NAME = (System.getProperty("BUNDLECONFIG_DIR") == null) ? "bundleconfig" : System.getProperty("BUNDLECONFIG_DIR"); - public static final String AAI_HOME_BUNDLECONFIG = (System.getProperty(AJSC_HOME) == null) ? AAI_FILESEP + "opt" + AAI_FILESEP + "app" + AAI_FILESEP + "aai" + AAI_FILESEP + AAI_BUNDLECONFIG_NAME : System.getProperty(AJSC_HOME)+ AAI_FILESEP + AAI_BUNDLECONFIG_NAME; + public static final String AAI_HOME = + (System.getProperty(AJSC_HOME) == null) ? AAI_FILESEP + "opt" + AAI_FILESEP + "app" + AAI_FILESEP + "aai" + : System.getProperty(AJSC_HOME); + public static final String AAI_BUNDLECONFIG_NAME = + (System.getProperty("BUNDLECONFIG_DIR") == null) ? "bundleconfig" : System.getProperty("BUNDLECONFIG_DIR"); + public static final String AAI_HOME_BUNDLECONFIG = (System.getProperty(AJSC_HOME) == null) + ? AAI_FILESEP + "opt" + AAI_FILESEP + "app" + AAI_FILESEP + "aai" + AAI_FILESEP + AAI_BUNDLECONFIG_NAME + : System.getProperty(AJSC_HOME) + AAI_FILESEP + AAI_BUNDLECONFIG_NAME; /** etc directory, relative to AAI_HOME */ public static final String AAI_HOME_ETC = AAI_HOME_BUNDLECONFIG + AAI_FILESEP + "etc" + AAI_FILESEP; @@ -42,7 +49,8 @@ public final class AAIConstants { public static final String REALTIME_DB_CONFIG = AAI_HOME_ETC_APP_PROPERTIES + "janusgraph-realtime.properties"; public static final String CACHED_DB_CONFIG = AAI_HOME_ETC_APP_PROPERTIES + "janusgraph-cached.properties"; public static final String AAI_HOME_ETC_OXM = AAI_HOME_ETC + "oxm" + AAI_FILESEP; - public static final String AAI_EVENT_DMAAP_PROPS = AAI_HOME_ETC_APP_PROPERTIES + "aaiEventDMaaPPublisher.properties"; + public static final String AAI_EVENT_DMAAP_PROPS = + AAI_HOME_ETC_APP_PROPERTIES + "aaiEventDMaaPPublisher.properties"; public static final String AAI_HOME_ETC_SCRIPT = AAI_HOME_ETC + AAI_FILESEP + "scriptdata" + AAI_FILESEP; public static final String AAI_LOGBACK_PROPS = "logback.xml"; @@ -100,7 +108,6 @@ public final class AAIConstants { public static final String AAI_RESVERSION_DISABLED_UUID = "aai.resourceversion.disabled.uuid"; public static final String AAI_RESVERSION_DISABLED_UUID_DEFAULT = "38cf3090-6a0c-4e9d-8142-4332a7352846"; - public static final long HISTORY_MAX_HOURS = 192; public static final String LOGGING_MAX_STACK_TRACE_ENTRIES = "aai.logging.maxStackTraceEntries"; @@ -111,6 +118,7 @@ public final class AAIConstants { /** Micro-service Names */ public static final String AAI_TRAVERSAL_MS = "aai-traversal"; public static final String AAI_RESOURCES_MS = "aai-resources"; + /** * Instantiates a new AAI constants. */ diff --git a/aai-core/src/main/java/org/onap/aai/util/AAISystemExitUtil.java b/aai-core/src/main/java/org/onap/aai/util/AAISystemExitUtil.java index 1d275784..ff5ee63e 100644 --- a/aai-core/src/main/java/org/onap/aai/util/AAISystemExitUtil.java +++ b/aai-core/src/main/java/org/onap/aai/util/AAISystemExitUtil.java @@ -17,20 +17,21 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import org.onap.aai.dbmap.AAIGraph; public class AAISystemExitUtil { - public static void systemExitCloseAAIGraph(int code) { - if ("true".equals(System.getProperty("org.onap.aai.graphadmin.started"))) { - return; - } - if (AAIGraph.isInit()) { - AAIGraph.getInstance().graphShutdown(); - } - System.exit(code); + public static void systemExitCloseAAIGraph(int code) { + if ("true".equals(System.getProperty("org.onap.aai.graphadmin.started"))) { + return; + } + if (AAIGraph.isInit()) { + AAIGraph.getInstance().graphShutdown(); + } + System.exit(code); - } + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/AAIUtils.java b/aai-core/src/main/java/org/onap/aai/util/AAIUtils.java index ba2cf9e2..390e6d9c 100644 --- a/aai-core/src/main/java/org/onap/aai/util/AAIUtils.java +++ b/aai-core/src/main/java/org/onap/aai/util/AAIUtils.java @@ -19,6 +19,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import java.text.DateFormat; @@ -28,7 +29,7 @@ import java.util.Date; import java.util.TimeZone; public class AAIUtils { - + /** * Instantiates AAIUtils. */ @@ -57,5 +58,5 @@ public class AAIUtils { DateFormat formatter = new SimpleDateFormat("YYMMdd-HH:mm:ss:SSS"); formatter.setTimeZone(TimeZone.getTimeZone("GMT")); return formatter.format(date); - } + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/Entity.java b/aai-core/src/main/java/org/onap/aai/util/Entity.java index ebb066b9..d1a3eafc 100644 --- a/aai-core/src/main/java/org/onap/aai/util/Entity.java +++ b/aai-core/src/main/java/org/onap/aai/util/Entity.java @@ -17,31 +17,30 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "equipment-role", - "action", - "key-value-list", - "self-link" -}) +@JsonPropertyOrder({"equipment-role", "action", "key-value-list", "self-link"}) public class Entity { @JsonProperty("equipment-role") @@ -58,7 +57,7 @@ public class Entity { /** * * @return - * The equipmentRole + * The equipmentRole */ @JsonProperty("equipment-role") public String getEquipmentRole() { @@ -68,7 +67,7 @@ public class Entity { /** * * @param equipmentRole - * The equipment-role + * The equipment-role */ @JsonProperty("equipment-role") public void setEquipmentRole(String equipmentRole) { @@ -83,7 +82,7 @@ public class Entity { /** * * @return - * The action + * The action */ @JsonProperty("action") public String getAction() { @@ -93,7 +92,7 @@ public class Entity { /** * * @param action - * The action + * The action */ @JsonProperty("action") public void setAction(String action) { @@ -108,7 +107,7 @@ public class Entity { /** * * @return - * The keyValueList + * The keyValueList */ @JsonProperty("key-value-list") public List getKeyValueList() { @@ -118,7 +117,7 @@ public class Entity { /** * * @param keyValueList - * The key-value-list + * The key-value-list */ @JsonProperty("key-value-list") public void setKeyValueList(List keyValueList) { @@ -133,7 +132,7 @@ public class Entity { /** * * @return - * The selfLink + * The selfLink */ @JsonProperty("self-link") public String getSelfLink() { @@ -143,7 +142,7 @@ public class Entity { /** * * @param selfLink - * The self-link + * The self-link */ @JsonProperty("self-link") public void setSelfLink(String selfLink) { @@ -177,7 +176,8 @@ public class Entity { @Override public int hashCode() { - return new HashCodeBuilder().append(equipmentRole).append(action).append(keyValueList).append(selfLink).append(additionalProperties).toHashCode(); + return new HashCodeBuilder().append(equipmentRole).append(action).append(keyValueList).append(selfLink) + .append(additionalProperties).toHashCode(); } @Override @@ -189,7 +189,9 @@ public class Entity { return false; } Entity rhs = ((Entity) other); - return new EqualsBuilder().append(equipmentRole, rhs.equipmentRole).append(action, rhs.action).append(keyValueList, rhs.keyValueList).append(selfLink, rhs.selfLink).append(additionalProperties, rhs.additionalProperties).isEquals(); + return new EqualsBuilder().append(equipmentRole, rhs.equipmentRole).append(action, rhs.action) + .append(keyValueList, rhs.keyValueList).append(selfLink, rhs.selfLink) + .append(additionalProperties, rhs.additionalProperties).isEquals(); } } diff --git a/aai-core/src/main/java/org/onap/aai/util/EntityList.java b/aai-core/src/main/java/org/onap/aai/util/EntityList.java index 0b600418..e86c5472 100644 --- a/aai-core/src/main/java/org/onap/aai/util/EntityList.java +++ b/aai-core/src/main/java/org/onap/aai/util/EntityList.java @@ -17,28 +17,30 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "entity" -}) +@JsonPropertyOrder({"entity"}) public class EntityList { @JsonProperty("entity") @@ -49,7 +51,7 @@ public class EntityList { /** * * @return - * The entity + * The entity */ @JsonProperty("entity") public List getEntity() { @@ -59,7 +61,7 @@ public class EntityList { /** * * @param entity - * The entity + * The entity */ @JsonProperty("entity") public void setEntity(List entity) { @@ -105,7 +107,8 @@ public class EntityList { return false; } EntityList rhs = ((EntityList) other); - return new EqualsBuilder().append(entity, rhs.entity).append(additionalProperties, rhs.additionalProperties).isEquals(); + return new EqualsBuilder().append(entity, rhs.entity).append(additionalProperties, rhs.additionalProperties) + .isEquals(); } } diff --git a/aai-core/src/main/java/org/onap/aai/util/FileWatcher.java b/aai-core/src/main/java/org/onap/aai/util/FileWatcher.java index cb8074de..07ac2642 100644 --- a/aai-core/src/main/java/org/onap/aai/util/FileWatcher.java +++ b/aai-core/src/main/java/org/onap/aai/util/FileWatcher.java @@ -17,42 +17,44 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; -import java.util.*; import java.io.*; +import java.util.*; public abstract class FileWatcher extends TimerTask { - private long timeStamp; - private File file; + private long timeStamp; + private File file; - /** - * Instantiates a new file watcher. - * - * @param file the file - */ - public FileWatcher( File file ) { - this.file = file; - this.timeStamp = file.lastModified(); - } + /** + * Instantiates a new file watcher. + * + * @param file the file + */ + public FileWatcher(File file) { + this.file = file; + this.timeStamp = file.lastModified(); + } - /** - * runs a timer task - * @see TimerTask.run - */ - public final void run() { - long timeStamp = file.lastModified(); + /** + * runs a timer task + * + * @see TimerTask.run + */ + public final void run() { + long timeStamp = file.lastModified(); - if( (timeStamp - this.timeStamp) > 500 ) { - this.timeStamp = timeStamp; - onChange(file); + if ((timeStamp - this.timeStamp) > 500) { + this.timeStamp = timeStamp; + onChange(file); + } } - } - - /** - * On change. - * - * @param file the file - */ - protected abstract void onChange( File file ); + + /** + * On change. + * + * @param file the file + */ + protected abstract void onChange(File file); } diff --git a/aai-core/src/main/java/org/onap/aai/util/FormatDate.java b/aai-core/src/main/java/org/onap/aai/util/FormatDate.java index 77e39f77..9ee2b71d 100644 --- a/aai-core/src/main/java/org/onap/aai/util/FormatDate.java +++ b/aai-core/src/main/java/org/onap/aai/util/FormatDate.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import java.time.ZoneId; @@ -25,21 +26,22 @@ import java.time.format.DateTimeFormatter; public class FormatDate { - private final String timeZone; - private final String pattern; - public FormatDate(String pattern) { - this.pattern = pattern; - this.timeZone = "GMT"; - } - public FormatDate(String pattern, String timeZone) { - this.pattern = pattern; - this.timeZone = timeZone; - } - - public String getDateTime() { - - final DateTimeFormatter formatter = - DateTimeFormatter.ofPattern(pattern); - return formatter.format(ZonedDateTime.now(ZoneId.of(timeZone))); - } + private final String timeZone; + private final String pattern; + + public FormatDate(String pattern) { + this.pattern = pattern; + this.timeZone = "GMT"; + } + + public FormatDate(String pattern, String timeZone) { + this.pattern = pattern; + this.timeZone = timeZone; + } + + public String getDateTime() { + + final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + return formatter.format(ZonedDateTime.now(ZoneId.of(timeZone))); + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/HbaseSaltPrefixer.java b/aai-core/src/main/java/org/onap/aai/util/HbaseSaltPrefixer.java index b687ee41..fef10a77 100644 --- a/aai-core/src/main/java/org/onap/aai/util/HbaseSaltPrefixer.java +++ b/aai-core/src/main/java/org/onap/aai/util/HbaseSaltPrefixer.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; /* @@ -26,34 +27,35 @@ package org.onap.aai.util; * as these keys are generated in a couple places, I made a class to contain that logic */ public class HbaseSaltPrefixer { - private int NUM_REGION_BUCKETS = 3; //the number of hbase region servers per cluster + private int NUM_REGION_BUCKETS = 3; // the number of hbase region servers per cluster + + private static class SingletonHolder { + private static final HbaseSaltPrefixer INSTANCE = new HbaseSaltPrefixer(); + } + + /** + * Instantiates a new hbase salt prefixer. + */ + private HbaseSaltPrefixer() { + } + + /** + * Gets the single instance of HbaseSaltPrefixer. + * + * @return single instance of HbaseSaltPrefixer + */ + public static HbaseSaltPrefixer getInstance() { + return SingletonHolder.INSTANCE; + } - private static class SingletonHolder{ - private static final HbaseSaltPrefixer INSTANCE = new HbaseSaltPrefixer(); - } - - /** - * Instantiates a new hbase salt prefixer. - */ - private HbaseSaltPrefixer(){} - - /** - * Gets the single instance of HbaseSaltPrefixer. - * - * @return single instance of HbaseSaltPrefixer - */ - public static HbaseSaltPrefixer getInstance() { - return SingletonHolder.INSTANCE; - } - - /** - * Prepend salt. - * - * @param key the key - * @return the string - */ - public String prependSalt(String key) { - int salt = Math.abs(key.hashCode()) % NUM_REGION_BUCKETS; - return salt + "-" + key; - } + /** + * Prepend salt. + * + * @param key the key + * @return the string + */ + public String prependSalt(String key) { + int salt = Math.abs(key.hashCode()) % NUM_REGION_BUCKETS; + return salt + "-" + key; + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/HttpsAuthClient.java b/aai-core/src/main/java/org/onap/aai/util/HttpsAuthClient.java index f092eac2..133c26a7 100644 --- a/aai-core/src/main/java/org/onap/aai/util/HttpsAuthClient.java +++ b/aai-core/src/main/java/org/onap/aai/util/HttpsAuthClient.java @@ -17,8 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.json.JSONConfiguration; +import com.sun.jersey.client.urlconnection.HTTPSProperties; + import java.io.FileInputStream; import java.security.KeyManagementException; import java.security.KeyStore; @@ -29,106 +38,94 @@ import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.client.filter.LoggingFilter; -import com.sun.jersey.api.json.JSONConfiguration; -import com.sun.jersey.client.urlconnection.HTTPSProperties; +public class HttpsAuthClient { + + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args) { + try { + String url = AAIConfig.get(AAIConstants.AAI_SERVER_URL) + "business/customers"; + System.out.println("Making Jersey https call..."); + Client client = HttpsAuthClient.getClient(); + + ClientResponse res = client.resource(url).accept("application/json").header("X-TransactionId", "PROV001") + .header("X-FromAppId", "AAI").type("application/json").get(ClientResponse.class); + + // System.out.println("Jersey result: "); + // System.out.println(res.getEntity(String.class).toString()); + + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Gets the client. + * + * @return the client + * @throws KeyManagementException the key management exception + */ + public static Client getClient() throws KeyManagementException { + + ClientConfig config = new DefaultClientConfig(); + config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); + config.getClasses().add(org.onap.aai.restcore.CustomJacksonJaxBJsonProvider.class); + + SSLContext ctx = null; + try { + String truststore_path = + AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_FILENAME); + String truststore_password = AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_PASSWD); + String keystore_path = AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_KEYSTORE_FILENAME); + String keystore_password = AAIConfig.get(AAIConstants.AAI_KEYSTORE_PASSWD); + + System.setProperty("javax.net.ssl.trustStore", truststore_path); + System.setProperty("javax.net.ssl.trustStorePassword", truststore_password); + HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + public boolean verify(String string, SSLSession ssls) { + return true; + } + }); + + ctx = SSLContext.getInstance("TLSv1.2"); + KeyManagerFactory kmf = null; + try { + kmf = KeyManagerFactory.getInstance("SunX509"); + FileInputStream fin = new FileInputStream(keystore_path); + KeyStore ks = KeyStore.getInstance("PKCS12"); + char[] pwd = keystore_password.toCharArray(); + ks.load(fin, pwd); + kmf.init(ks, pwd); + } catch (Exception e) { + System.out.println("Error setting up kmf: exiting"); + e.printStackTrace(); + System.exit(1); + } + + ctx.init(kmf.getKeyManagers(), null, null); + config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, + new HTTPSProperties(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }, ctx)); + } catch (Exception e) { + System.out.println("Error setting up config: exiting"); + e.printStackTrace(); + System.exit(1); + } + + Client client = Client.create(config); + // uncomment this line to get more logging for the request/response + // client.addFilter(new LoggingFilter(System.out)); + + return client; + } -public class HttpsAuthClient{ - - /** - * The main method. - * - * @param args the arguments - */ - public static void main(String[] args) { - try { - String url = AAIConfig.get(AAIConstants.AAI_SERVER_URL) + "business/customers"; - System.out.println("Making Jersey https call..."); - Client client = HttpsAuthClient.getClient(); - - ClientResponse res = client.resource(url) - .accept("application/json") - .header("X-TransactionId", "PROV001") - .header("X-FromAppId", "AAI") - .type("application/json") - .get(ClientResponse.class); - -// System.out.println("Jersey result: "); -// System.out.println(res.getEntity(String.class).toString()); - - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - /** - * Gets the client. - * - * @return the client - * @throws KeyManagementException the key management exception - */ - public static Client getClient() throws KeyManagementException { - - ClientConfig config = new DefaultClientConfig(); - config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); - config.getClasses().add(org.onap.aai.restcore.CustomJacksonJaxBJsonProvider.class); - - SSLContext ctx = null; - try { - String truststore_path = AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_FILENAME); - String truststore_password = AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_PASSWD); - String keystore_path = AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_KEYSTORE_FILENAME); - String keystore_password = AAIConfig.get(AAIConstants.AAI_KEYSTORE_PASSWD); - - System.setProperty("javax.net.ssl.trustStore", truststore_path); - System.setProperty("javax.net.ssl.trustStorePassword", truststore_password); - HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ - public boolean verify(String string,SSLSession ssls) { - return true; - } - }); - - ctx = SSLContext.getInstance("TLSv1.2"); - KeyManagerFactory kmf = null; - try { - kmf = KeyManagerFactory.getInstance("SunX509"); - FileInputStream fin = new FileInputStream(keystore_path); - KeyStore ks = KeyStore.getInstance("PKCS12"); - char[] pwd = keystore_password.toCharArray(); - ks.load(fin, pwd); - kmf.init(ks, pwd); - } catch (Exception e) { - System.out.println("Error setting up kmf: exiting"); - e.printStackTrace(); - System.exit(1); - } - - ctx.init(kmf.getKeyManagers(), null, null); - config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, - new HTTPSProperties( new HostnameVerifier() { - @Override - public boolean verify( String s, SSLSession sslSession ) { - return true; - } - }, ctx)); - } catch (Exception e) { - System.out.println("Error setting up config: exiting"); - e.printStackTrace(); - System.exit(1); - } - - Client client = Client.create(config); - // uncomment this line to get more logging for the request/response - // client.addFilter(new LoggingFilter(System.out)); - - return client; - } - -} +} diff --git a/aai-core/src/main/java/org/onap/aai/util/HttpsAuthExternalClient.java b/aai-core/src/main/java/org/onap/aai/util/HttpsAuthExternalClient.java index 4e673b6a..53e2d958 100644 --- a/aai-core/src/main/java/org/onap/aai/util/HttpsAuthExternalClient.java +++ b/aai-core/src/main/java/org/onap/aai/util/HttpsAuthExternalClient.java @@ -17,94 +17,94 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.json.JSONConfiguration; +import com.sun.jersey.client.urlconnection.HTTPSProperties; + import java.io.FileInputStream; import java.security.KeyStore; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.json.JSONConfiguration; -import com.sun.jersey.client.urlconnection.HTTPSProperties; +import javax.net.ssl.TrustManagerFactory; public class HttpsAuthExternalClient { + /** + * Gets the client. + * + * @param keystoreFileName the keystore file name + * @param keystorePassword the keystore password + * @return the client + * @throws Exception the exception + */ + public static Client getClient(String keystoreFileName, String keystorePassword) throws Exception { + + ClientConfig config = new DefaultClientConfig(); + config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); + config.getClasses().add(org.onap.aai.restcore.CustomJacksonJaxBJsonProvider.class); + Client client = null; + SSLContext ctx = null; + String truststore_path = AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_FILENAME); + try (FileInputStream tin = new FileInputStream(truststore_path)) { + String truststore_password = AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_PASSWD); + String keystore_path = AAIConstants.AAI_HOME_ETC_AUTH + keystoreFileName; + String keystore_password = keystorePassword; + // System.setProperty("javax.net.ssl.trustStore", truststore_path); + // System.setProperty("javax.net.ssl.trustStorePassword", truststore_password); + HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + public boolean verify(String string, SSLSession ssls) { + return true; + } + }); + + ctx = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = null; + + /**** + * kmf = KeyManagerFactory.getInstance("SunX509"); + * FileInputStream fin = new FileInputStream(keystore_path); + * KeyStore ks = KeyStore.getInstance("PKCS12"); + * char[] pwd = keystore_password.toCharArray(); + * ks.load(fin, pwd); + * kmf.init(ks, pwd); + ***/ + + String alg = TrustManagerFactory.getDefaultAlgorithm(); + TrustManagerFactory tmf = TrustManagerFactory.getInstance(alg); + + KeyStore ts = KeyStore.getInstance("PKCS12"); + char[] tpwd = truststore_password.toCharArray(); + ts.load(tin, tpwd); + tmf.init(ts); + + // ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); + // Updating key manager to null, to disable two way SSL + ctx.init(null, tmf.getTrustManagers(), null); - /** - * Gets the client. - * - * @param keystoreFileName the keystore file name - * @param keystorePassword the keystore password - * @return the client - * @throws Exception the exception - */ - public static Client getClient ( String keystoreFileName, String keystorePassword ) throws Exception { - - ClientConfig config = new DefaultClientConfig(); - config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); - config.getClasses().add(org.onap.aai.restcore.CustomJacksonJaxBJsonProvider.class); - Client client = null; - SSLContext ctx = null; - String truststore_path = AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_FILENAME); - try(FileInputStream tin = new FileInputStream(truststore_path)) { - String truststore_password = AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_PASSWD); - String keystore_path = AAIConstants.AAI_HOME_ETC_AUTH + keystoreFileName; - String keystore_password = keystorePassword; - //System.setProperty("javax.net.ssl.trustStore", truststore_path); - //System.setProperty("javax.net.ssl.trustStorePassword", truststore_password); - HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ - public boolean verify(String string,SSLSession ssls) { - return true; - } - }); - - ctx = SSLContext.getInstance("TLS"); - KeyManagerFactory kmf = null; + config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, + new HTTPSProperties(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }, ctx)); - - /**** kmf = KeyManagerFactory.getInstance("SunX509"); - FileInputStream fin = new FileInputStream(keystore_path); - KeyStore ks = KeyStore.getInstance("PKCS12"); - char[] pwd = keystore_password.toCharArray(); - ks.load(fin, pwd); - kmf.init(ks, pwd); - ***/ - - String alg = TrustManagerFactory.getDefaultAlgorithm(); - TrustManagerFactory tmf = TrustManagerFactory.getInstance(alg); + client = Client.create(config); + // uncomment this line to get more logging for the request/response + // client.addFilter(new LoggingFilter(System.out)); + } catch (Exception e) { + throw e; + } + return client; + } - KeyStore ts = KeyStore.getInstance("PKCS12"); - char[] tpwd = truststore_password.toCharArray(); - ts.load(tin, tpwd); - tmf.init(ts); - - //ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); - // Updating key manager to null, to disable two way SSL - ctx.init(null, tmf.getTrustManagers(), null); - - config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, - new HTTPSProperties( new HostnameVerifier() { - @Override - public boolean verify( String s, SSLSession sslSession ) { - return true; - } - }, ctx)); - - client = Client.create(config); - // uncomment this line to get more logging for the request/response - // client.addFilter(new LoggingFilter(System.out)); - } catch (Exception e) { - throw e; - } - return client; - } - -} +} diff --git a/aai-core/src/main/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtil.java b/aai-core/src/main/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtil.java index e8bd8af6..463a668b 100644 --- a/aai-core/src/main/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtil.java +++ b/aai-core/src/main/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtil.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import org.apache.commons.cli.CommandLine; @@ -48,49 +49,49 @@ import org.eclipse.jetty.util.security.Password; */ public class JettyObfuscationConversionCommandLineUtil { - /** - * The main method. - * - * @param args the arguments - */ - public static void main(String[] args){ - Options options = new Options(); - options.addOption("e", true, "obfuscate the given string"); - options.addOption("d", true, "deobfuscate the given string"); + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args) { + Options options = new Options(); + options.addOption("e", true, "obfuscate the given string"); + options.addOption("d", true, "deobfuscate the given string"); - CommandLineParser parser = new DefaultParser(); + CommandLineParser parser = new DefaultParser(); - try { - CommandLine cmd = parser.parse(options, args); - String toProcess = null; + try { + CommandLine cmd = parser.parse(options, args); + String toProcess = null; - if (cmd.hasOption("e")){ - toProcess = cmd.getOptionValue("e"); - String encoded = Password.obfuscate(toProcess); - System.out.println(encoded); - } else if (cmd.hasOption("d")) { - toProcess = cmd.getOptionValue("d"); - String decoded_str = Password.deobfuscate(toProcess); - System.out.println(decoded_str); - } else { - usage(); - } - } catch (ParseException e) { - System.out.println("failed to parse input"); - System.out.println(e.toString()); - usage(); - } catch (Exception e) { - System.out.println("exception:" + e.toString()); - } - } + if (cmd.hasOption("e")) { + toProcess = cmd.getOptionValue("e"); + String encoded = Password.obfuscate(toProcess); + System.out.println(encoded); + } else if (cmd.hasOption("d")) { + toProcess = cmd.getOptionValue("d"); + String decoded_str = Password.deobfuscate(toProcess); + System.out.println(decoded_str); + } else { + usage(); + } + } catch (ParseException e) { + System.out.println("failed to parse input"); + System.out.println(e.toString()); + usage(); + } catch (Exception e) { + System.out.println("exception:" + e.toString()); + } + } - /** - * Usage. - */ - private static void usage(){ - System.out.println("usage:");; - System.out.println("-e [string] to obfuscate"); - System.out.println("-d [string] to deobfuscate"); - System.out.println("-h help"); - } + /** + * Usage. + */ + private static void usage() { + System.out.println("usage:");; + System.out.println("-e [string] to obfuscate"); + System.out.println("-d [string] to deobfuscate"); + System.out.println("-h help"); + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/KeyValueList.java b/aai-core/src/main/java/org/onap/aai/util/KeyValueList.java index cf0929db..1536d772 100644 --- a/aai-core/src/main/java/org/onap/aai/util/KeyValueList.java +++ b/aai-core/src/main/java/org/onap/aai/util/KeyValueList.java @@ -17,27 +17,28 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Generated; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; @JsonInclude(JsonInclude.Include.NON_NULL) @Generated("org.jsonschema2pojo") -@JsonPropertyOrder({ - "key", - "value" -}) +@JsonPropertyOrder({"key", "value"}) public class KeyValueList { @JsonProperty("key") @@ -50,7 +51,7 @@ public class KeyValueList { /** * * @return - * The key + * The key */ @JsonProperty("key") public String getKey() { @@ -60,7 +61,7 @@ public class KeyValueList { /** * * @param key - * The key + * The key */ @JsonProperty("key") public void setKey(String key) { @@ -75,7 +76,7 @@ public class KeyValueList { /** * * @return - * The value + * The value */ @JsonProperty("value") public String getValue() { @@ -85,7 +86,7 @@ public class KeyValueList { /** * * @param value - * The value + * The value */ @JsonProperty("value") public void setValue(String value) { @@ -131,7 +132,8 @@ public class KeyValueList { return false; } KeyValueList rhs = ((KeyValueList) other); - return new EqualsBuilder().append(key, rhs.key).append(value, rhs.value).append(additionalProperties, rhs.additionalProperties).isEquals(); + return new EqualsBuilder().append(key, rhs.key).append(value, rhs.value) + .append(additionalProperties, rhs.additionalProperties).isEquals(); } } diff --git a/aai-core/src/main/java/org/onap/aai/util/MapperUtil.java b/aai-core/src/main/java/org/onap/aai/util/MapperUtil.java index 4fed0666..47a937d4 100644 --- a/aai-core/src/main/java/org/onap/aai/util/MapperUtil.java +++ b/aai-core/src/main/java/org/onap/aai/util/MapperUtil.java @@ -19,13 +19,15 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; -import org.onap.aai.exceptions.AAIException; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import org.onap.aai.exceptions.AAIException; + public class MapperUtil { /** @@ -34,7 +36,7 @@ public class MapperUtil { private MapperUtil() { // prevent instantiation } - + /** * Read as object of. * diff --git a/aai-core/src/main/java/org/onap/aai/util/PojoUtils.java b/aai-core/src/main/java/org/onap/aai/util/PojoUtils.java index f3e67388..218f0dd8 100644 --- a/aai-core/src/main/java/org/onap/aai/util/PojoUtils.java +++ b/aai-core/src/main/java/org/onap/aai/util/PojoUtils.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import com.fasterxml.jackson.annotation.JsonInclude; @@ -28,16 +29,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import com.google.common.base.CaseFormat; import com.google.common.collect.Multimap; -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.eclipse.persistence.dynamic.DynamicEntity; -import org.eclipse.persistence.jaxb.JAXBMarshaller; -import org.eclipse.persistence.jaxb.MarshallerProperties; -import org.onap.aai.domain.model.AAIResource; -import org.onap.aai.exceptions.AAIException; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; import java.io.IOException; import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; @@ -45,305 +37,323 @@ import java.lang.reflect.Method; import java.security.SecureRandom; import java.util.*; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.eclipse.persistence.dynamic.DynamicEntity; +import org.eclipse.persistence.jaxb.JAXBMarshaller; +import org.eclipse.persistence.jaxb.MarshallerProperties; +import org.onap.aai.domain.model.AAIResource; +import org.onap.aai.exceptions.AAIException; + public class PojoUtils { - /** - * Gets the key value list. - * - * @param the generic type - * @param e the e - * @param clazz the clazz - * @return the key value list - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - */ - public List getKeyValueList(Entity e, T clazz) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - List kvList = e.getKeyValueList(); - Object value = null; - Method[] methods = clazz.getClass().getDeclaredMethods(); - String propertyName = ""; - - for (Method method : methods) { - if (method.getName().startsWith("get")) { - propertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN,method.getName().substring(3)); - if (!(method.getReturnType().getName().contains("aai")) || method.getReturnType().getName().contains("java.util.List")) { - value = method.invoke(clazz); - KeyValueList kv = new KeyValueList(); - kv.setKey(propertyName); - if (value != null) { - kv.setValue(value.toString()); - } else { - kv.setValue(""); - } - kvList.add(kv); - } - } - } - return kvList; - } - - /** - * Gets the json from object. - * - * @param the generic type - * @param clazz the clazz - * @return the json from object - * @throws JsonGenerationException the json generation exception - * @throws JsonMappingException the json mapping exception - * @throws IOException Signals that an I/O exception has occurred. - */ - public String getJsonFromObject(T clazz) throws JsonGenerationException, JsonMappingException, IOException { - return getJsonFromObject(clazz, false, true); - } - - /** - * Gets the json from object. - * - * @param the generic type - * @param clazz the clazz - * @param wrapRoot the wrap root - * @param indent the indent - * @return the json from object - * @throws JsonGenerationException the json generation exception - * @throws JsonMappingException the json mapping exception - * @throws IOException Signals that an I/O exception has occurred. - */ - public String getJsonFromObject(T clazz, boolean wrapRoot, boolean indent) throws JsonGenerationException, JsonMappingException, IOException { - ObjectMapper mapper = new ObjectMapper(); - - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.INDENT_OUTPUT, indent); - mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, wrapRoot); - - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, wrapRoot); - - mapper.registerModule(new JaxbAnnotationModule()); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - mapper.writeValue(baos, clazz); - - return baos.toString(); - } - - /** - * Gets the json from dynamic object. - * - * @param ent the ent - * @param jaxbContext the jaxb context - * @param includeRoot the include root - * @return the json from dynamic object - * @throws JsonGenerationException the json generation exception - * @throws JsonMappingException the json mapping exception - * @throws IOException Signals that an I/O exception has occurred. - * @throws JAXBException the JAXB exception - */ - public String getJsonFromDynamicObject(DynamicEntity ent, org.eclipse.persistence.jaxb.JAXBContext jaxbContext, boolean includeRoot) throws JsonGenerationException, JsonMappingException, IOException, JAXBException { - JAXBMarshaller marshaller = jaxbContext.createMarshaller(); - - marshaller.setProperty(JAXBMarshaller.JAXB_FORMATTED_OUTPUT, false); - marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, Boolean.FALSE) ; - marshaller.setProperty("eclipselink.json.include-root", includeRoot); - marshaller.setProperty("eclipselink.media-type", "application/json"); - StringWriter writer = new StringWriter(); - marshaller.marshal(ent, writer); - - return writer.toString(); - } - - /** - * Gets the xml from object. - * - * @param the generic type - * @param clazz the clazz - * @return the xml from object - * @throws JAXBException the JAXB exception - * @throws IOException - */ - public String getXmlFromObject(T clazz) throws JAXBException, IOException { - try(ByteArrayOutputStream baos = new ByteArrayOutputStream()){ - JAXBContext jc = JAXBContext.newInstance(clazz.getClass().getPackage().getName()); - - Marshaller marshaller = jc.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - marshaller.marshal(clazz, baos); - return baos.toString(); - } - } - - /** - * Gets the lookup key. - * - * @param baseKey the base key - * @param lookupHash the lookup hash - * @param keyProps the key props - * @return the lookup key - */ - public String getLookupKey (String baseKey, HashMap lookupHash, Collection keyProps) { - int baseKeyLen = baseKey.length(); - StringBuffer newKey = new StringBuffer(); - if (baseKeyLen > 0) { - newKey.append(baseKey); - } - - Iterator keyPropI = keyProps.iterator(); - while( keyPropI.hasNext() ){ - String keyProp = keyPropI.next(); - if (baseKeyLen > 0) { - newKey.append("&"); - } - newKey.append(keyProp + "=" + lookupHash.get(keyProp)); - } - return newKey.toString(); - } - - /** - * Gets the lookup keys. - * - * @param lookupHashes the lookup hashes - * @param _dbRulesNodeKeyProps the db rules node key props - * @return the lookup keys - */ - public String getLookupKeys (LinkedHashMap> lookupHashes, Multimap _dbRulesNodeKeyProps) { - Iterator it = lookupHashes.keySet().iterator(); - String lookupKeys = ""; - while (it.hasNext()) { - String objectType = (String)it.next(); - HashMap lookupHash = lookupHashes.get(objectType); - - Collection keyProps = _dbRulesNodeKeyProps.get(objectType); - Iterator keyPropI = keyProps.iterator(); - while( keyPropI.hasNext() ){ - lookupKeys += lookupHash.get(keyPropI.next()); - } - } - return lookupKeys; - } - - /** - * Gets the example object. - * - * @param the generic type - * @param clazz the clazz - * @param singleton the singleton - * @return the example object - * @throws IllegalAccessException the illegal access exception - * @throws IllegalArgumentException the illegal argument exception - * @throws InvocationTargetException the invocation target exception - * @throws NoSuchMethodException the no such method exception - * @throws SecurityException the security exception - * @throws AAIException the AAI exception - */ - public void getExampleObject(T clazz, boolean singleton) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, AAIException { - Method[] methods = clazz.getClass().getDeclaredMethods(); - String dnHypPropertyName = ""; - String upCamPropertyName = ""; - Random rand = new SecureRandom(); - int randInt = rand.nextInt(10000000); - - for (Method method : methods) { - boolean go = false; - if (method.getName().startsWith("get")) { - dnHypPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN,method.getName().substring(3)); - upCamPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL,method.getName().substring(3)); - go = true; - } else if (method.getName().startsWith("is")) { - dnHypPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN,method.getName().substring(2)); - upCamPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL,method.getName().substring(2)); - go = true; - } - // don't return resource-version on a singleton - if (singleton && dnHypPropertyName.equals("resource-version")) { - go = false; - } - if (go) { - String retType = method.getReturnType().getName(); - if (!retType.contains("aai") && !retType.contains("java.util.List")) { - // get the setter - Method meth = clazz.getClass().getMethod("set" + upCamPropertyName, method.getReturnType()); - - if (retType.contains("String")) { - String val = "example-" + dnHypPropertyName + "-val-" + randInt; - if (val != null) { - meth.invoke(clazz, val); - } - } else if (retType.toLowerCase().contains("long")) { - Integer foo = rand.nextInt(100000); - meth.invoke(clazz, foo.longValue()); - } else if (retType.toLowerCase().contains("int")) { - meth.invoke(clazz, rand.nextInt(100000)); - } else if (retType.toLowerCase().contains("short")) { - Integer randShort = rand.nextInt(10000); - meth.invoke(clazz, randShort.shortValue()); - } else if (retType.toLowerCase().contains("boolean")) { - meth.invoke(clazz, true); - } - // i think max has a list in license-management - } - } - } - } - - /** - * Gets the dynamic example object. - * - * @param childObject the child object - * @param aaiRes the aai res - * @param singleton the singleton - * @return the dynamic example object - */ - public void getDynamicExampleObject(DynamicEntity childObject, AAIResource aaiRes, boolean singleton) { - // TODO Auto-generated method stub - - Random rand = new SecureRandom(); - Integer randInt = rand.nextInt(100000); - long range = 100000000L; - long randLong = (long)(rand.nextDouble()*range); - Integer randShrt = rand.nextInt(20000); - short randShort = randShrt.shortValue(); - - for (String dnHypAttrName : aaiRes.getStringFields()) { - - if (singleton && ("resource-version").equals(dnHypAttrName)) { - continue; - } - - String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL,dnHypAttrName); - childObject.set(dnCamAttrName, "example-" + dnHypAttrName + "-val-" + randInt); - - } - - for (String dnHypAttrName : aaiRes.getStringListFields()) { - ArrayList exampleList = new ArrayList(); - exampleList.add("example-" + dnHypAttrName + "-val-" + randInt + "-" + 1); - exampleList.add("example-" + dnHypAttrName + "-val-" + randInt + "-" + 2); - String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL,dnHypAttrName); - childObject.set(dnCamAttrName, exampleList); - } - - // the attrName might need to be converted to camel case!!! - for (String dnHypAttrName : aaiRes.getLongFields()) { - String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL,dnHypAttrName); - childObject.set(dnCamAttrName, randLong); - } - - for (String dnHypAttrName : aaiRes.getIntFields()) { - String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL,dnHypAttrName); - childObject.set(dnCamAttrName, randInt); - } - - for (String dnHypAttrName : aaiRes.getShortFields()) { - String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL,dnHypAttrName); - childObject.set(dnCamAttrName, randShort); - } - - for (String dnHypAttrName : aaiRes.getBooleanFields()) { - String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL,dnHypAttrName); - childObject.set(dnCamAttrName, Boolean.TRUE); - } - } + /** + * Gets the key value list. + * + * @param the generic type + * @param e the e + * @param clazz the clazz + * @return the key value list + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + */ + public List getKeyValueList(Entity e, T clazz) + throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + List kvList = e.getKeyValueList(); + Object value = null; + Method[] methods = clazz.getClass().getDeclaredMethods(); + String propertyName = ""; + + for (Method method : methods) { + if (method.getName().startsWith("get")) { + propertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, method.getName().substring(3)); + if (!(method.getReturnType().getName().contains("aai")) + || method.getReturnType().getName().contains("java.util.List")) { + value = method.invoke(clazz); + KeyValueList kv = new KeyValueList(); + kv.setKey(propertyName); + if (value != null) { + kv.setValue(value.toString()); + } else { + kv.setValue(""); + } + kvList.add(kv); + } + } + } + return kvList; + } + + /** + * Gets the json from object. + * + * @param the generic type + * @param clazz the clazz + * @return the json from object + * @throws JsonGenerationException the json generation exception + * @throws JsonMappingException the json mapping exception + * @throws IOException Signals that an I/O exception has occurred. + */ + public String getJsonFromObject(T clazz) throws JsonGenerationException, JsonMappingException, IOException { + return getJsonFromObject(clazz, false, true); + } + + /** + * Gets the json from object. + * + * @param the generic type + * @param clazz the clazz + * @param wrapRoot the wrap root + * @param indent the indent + * @return the json from object + * @throws JsonGenerationException the json generation exception + * @throws JsonMappingException the json mapping exception + * @throws IOException Signals that an I/O exception has occurred. + */ + public String getJsonFromObject(T clazz, boolean wrapRoot, boolean indent) + throws JsonGenerationException, JsonMappingException, IOException { + ObjectMapper mapper = new ObjectMapper(); + + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.configure(SerializationFeature.INDENT_OUTPUT, indent); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, wrapRoot); + + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, wrapRoot); + + mapper.registerModule(new JaxbAnnotationModule()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + mapper.writeValue(baos, clazz); + + return baos.toString(); + } + + /** + * Gets the json from dynamic object. + * + * @param ent the ent + * @param jaxbContext the jaxb context + * @param includeRoot the include root + * @return the json from dynamic object + * @throws JsonGenerationException the json generation exception + * @throws JsonMappingException the json mapping exception + * @throws IOException Signals that an I/O exception has occurred. + * @throws JAXBException the JAXB exception + */ + public String getJsonFromDynamicObject(DynamicEntity ent, org.eclipse.persistence.jaxb.JAXBContext jaxbContext, + boolean includeRoot) throws JsonGenerationException, JsonMappingException, IOException, JAXBException { + JAXBMarshaller marshaller = jaxbContext.createMarshaller(); + + marshaller.setProperty(JAXBMarshaller.JAXB_FORMATTED_OUTPUT, false); + marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, Boolean.FALSE); + marshaller.setProperty("eclipselink.json.include-root", includeRoot); + marshaller.setProperty("eclipselink.media-type", "application/json"); + StringWriter writer = new StringWriter(); + marshaller.marshal(ent, writer); + + return writer.toString(); + } + + /** + * Gets the xml from object. + * + * @param the generic type + * @param clazz the clazz + * @return the xml from object + * @throws JAXBException the JAXB exception + * @throws IOException + */ + public String getXmlFromObject(T clazz) throws JAXBException, IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + JAXBContext jc = JAXBContext.newInstance(clazz.getClass().getPackage().getName()); + + Marshaller marshaller = jc.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.marshal(clazz, baos); + return baos.toString(); + } + } + + /** + * Gets the lookup key. + * + * @param baseKey the base key + * @param lookupHash the lookup hash + * @param keyProps the key props + * @return the lookup key + */ + public String getLookupKey(String baseKey, HashMap lookupHash, Collection keyProps) { + int baseKeyLen = baseKey.length(); + StringBuffer newKey = new StringBuffer(); + if (baseKeyLen > 0) { + newKey.append(baseKey); + } + + Iterator keyPropI = keyProps.iterator(); + while (keyPropI.hasNext()) { + String keyProp = keyPropI.next(); + if (baseKeyLen > 0) { + newKey.append("&"); + } + newKey.append(keyProp + "=" + lookupHash.get(keyProp)); + } + return newKey.toString(); + } + + /** + * Gets the lookup keys. + * + * @param lookupHashes the lookup hashes + * @param _dbRulesNodeKeyProps the db rules node key props + * @return the lookup keys + */ + public String getLookupKeys(LinkedHashMap> lookupHashes, + Multimap _dbRulesNodeKeyProps) { + Iterator it = lookupHashes.keySet().iterator(); + String lookupKeys = ""; + while (it.hasNext()) { + String objectType = (String) it.next(); + HashMap lookupHash = lookupHashes.get(objectType); + + Collection keyProps = _dbRulesNodeKeyProps.get(objectType); + Iterator keyPropI = keyProps.iterator(); + while (keyPropI.hasNext()) { + lookupKeys += lookupHash.get(keyPropI.next()); + } + } + return lookupKeys; + } + + /** + * Gets the example object. + * + * @param the generic type + * @param clazz the clazz + * @param singleton the singleton + * @return the example object + * @throws IllegalAccessException the illegal access exception + * @throws IllegalArgumentException the illegal argument exception + * @throws InvocationTargetException the invocation target exception + * @throws NoSuchMethodException the no such method exception + * @throws SecurityException the security exception + * @throws AAIException the AAI exception + */ + public void getExampleObject(T clazz, boolean singleton) + throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, + SecurityException, AAIException { + Method[] methods = clazz.getClass().getDeclaredMethods(); + String dnHypPropertyName = ""; + String upCamPropertyName = ""; + Random rand = new SecureRandom(); + int randInt = rand.nextInt(10000000); + + for (Method method : methods) { + boolean go = false; + if (method.getName().startsWith("get")) { + dnHypPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, method.getName().substring(3)); + upCamPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL, method.getName().substring(3)); + go = true; + } else if (method.getName().startsWith("is")) { + dnHypPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, method.getName().substring(2)); + upCamPropertyName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL, method.getName().substring(2)); + go = true; + } + // don't return resource-version on a singleton + if (singleton && dnHypPropertyName.equals("resource-version")) { + go = false; + } + if (go) { + String retType = method.getReturnType().getName(); + if (!retType.contains("aai") && !retType.contains("java.util.List")) { + // get the setter + Method meth = clazz.getClass().getMethod("set" + upCamPropertyName, method.getReturnType()); + + if (retType.contains("String")) { + String val = "example-" + dnHypPropertyName + "-val-" + randInt; + if (val != null) { + meth.invoke(clazz, val); + } + } else if (retType.toLowerCase().contains("long")) { + Integer foo = rand.nextInt(100000); + meth.invoke(clazz, foo.longValue()); + } else if (retType.toLowerCase().contains("int")) { + meth.invoke(clazz, rand.nextInt(100000)); + } else if (retType.toLowerCase().contains("short")) { + Integer randShort = rand.nextInt(10000); + meth.invoke(clazz, randShort.shortValue()); + } else if (retType.toLowerCase().contains("boolean")) { + meth.invoke(clazz, true); + } + // i think max has a list in license-management + } + } + } + } + + /** + * Gets the dynamic example object. + * + * @param childObject the child object + * @param aaiRes the aai res + * @param singleton the singleton + * @return the dynamic example object + */ + public void getDynamicExampleObject(DynamicEntity childObject, AAIResource aaiRes, boolean singleton) { + // TODO Auto-generated method stub + + Random rand = new SecureRandom(); + Integer randInt = rand.nextInt(100000); + long range = 100000000L; + long randLong = (long) (rand.nextDouble() * range); + Integer randShrt = rand.nextInt(20000); + short randShort = randShrt.shortValue(); + + for (String dnHypAttrName : aaiRes.getStringFields()) { + + if (singleton && ("resource-version").equals(dnHypAttrName)) { + continue; + } + + String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dnHypAttrName); + childObject.set(dnCamAttrName, "example-" + dnHypAttrName + "-val-" + randInt); + + } + + for (String dnHypAttrName : aaiRes.getStringListFields()) { + ArrayList exampleList = new ArrayList(); + exampleList.add("example-" + dnHypAttrName + "-val-" + randInt + "-" + 1); + exampleList.add("example-" + dnHypAttrName + "-val-" + randInt + "-" + 2); + String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dnHypAttrName); + childObject.set(dnCamAttrName, exampleList); + } + + // the attrName might need to be converted to camel case!!! + for (String dnHypAttrName : aaiRes.getLongFields()) { + String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dnHypAttrName); + childObject.set(dnCamAttrName, randLong); + } + + for (String dnHypAttrName : aaiRes.getIntFields()) { + String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dnHypAttrName); + childObject.set(dnCamAttrName, randInt); + } + + for (String dnHypAttrName : aaiRes.getShortFields()) { + String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dnHypAttrName); + childObject.set(dnCamAttrName, randShort); + } + + for (String dnHypAttrName : aaiRes.getBooleanFields()) { + String dnCamAttrName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dnHypAttrName); + childObject.set(dnCamAttrName, Boolean.TRUE); + } + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/Request.java b/aai-core/src/main/java/org/onap/aai/util/Request.java index fb695b2f..890398d5 100644 --- a/aai-core/src/main/java/org/onap/aai/util/Request.java +++ b/aai-core/src/main/java/org/onap/aai/util/Request.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import java.io.UnsupportedEncodingException; @@ -31,126 +32,123 @@ import org.onap.aai.exceptions.AAIException; public class Request { - public static final String V14 = "v14"; - public final String fromAppId; - public final String transactionId; - public final String path; - public final RestObject restObj; - public final boolean oldServer; - public final String apiVersion; - - - /** - * Instantiates a new request. - * - * @param builder the builder - */ - public Request(RequestBuilder builder) { - - fromAppId = builder.fromAppId; - transactionId = builder.transactionId; - restObj = builder.restObj; - oldServer = builder.oldServer; - apiVersion = builder.apiVersion; - - if (!oldServer) { - path = apiVersion + "/" + builder.path; - } else { - path = builder.path; - } - - - } - - public static class RequestBuilder { - private String fromAppId; - private String transactionId; - private String path; - private RestObject restObj; - private boolean oldServer; - private String apiVersion = Request.V14; - - - /** - * Sets the from app id. - * - * @param fromAppId the from app id - * @return the request builder - */ - public RequestBuilder setFromAppId(String fromAppId) { - this.fromAppId = fromAppId; - return this; - } - - /** - * Sets the transaction id. - * - * @param transactionId the transaction id - * @return the request builder - */ - public RequestBuilder setTransactionId(String transactionId) { - this.transactionId = transactionId; - return this; - - } - - /** - * Sets the path. - * - * @param path the path - * @return the request builder - */ - public RequestBuilder setPath(String path) { - - this.path = path; - return this; - - } - - /** - * Sets the restcore obj. - * - * @param restObj the restcore obj - * @return the request builder - */ - public RequestBuilder setRestObj(RestObject restObj) { - this.restObj = restObj; - return this; - - } - - /** - * Sets the old server. - * - * @param oldServer the old server - * @return the request builder - */ - public RequestBuilder setOldServer(boolean oldServer) { - this.oldServer = oldServer; - return this; - - } - - /** - * Sets the api version. - * - * @param apiVersion the api version - * @return the request builder - */ - public RequestBuilder setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - return this; - } - - /** - * Builds the. - * - * @return the request - */ - public Request build() { - return new Request(this); - } - - } - + public static final String V14 = "v14"; + public final String fromAppId; + public final String transactionId; + public final String path; + public final RestObject restObj; + public final boolean oldServer; + public final String apiVersion; + + /** + * Instantiates a new request. + * + * @param builder the builder + */ + public Request(RequestBuilder builder) { + + fromAppId = builder.fromAppId; + transactionId = builder.transactionId; + restObj = builder.restObj; + oldServer = builder.oldServer; + apiVersion = builder.apiVersion; + + if (!oldServer) { + path = apiVersion + "/" + builder.path; + } else { + path = builder.path; + } + + } + + public static class RequestBuilder { + private String fromAppId; + private String transactionId; + private String path; + private RestObject restObj; + private boolean oldServer; + private String apiVersion = Request.V14; + + /** + * Sets the from app id. + * + * @param fromAppId the from app id + * @return the request builder + */ + public RequestBuilder setFromAppId(String fromAppId) { + this.fromAppId = fromAppId; + return this; + } + + /** + * Sets the transaction id. + * + * @param transactionId the transaction id + * @return the request builder + */ + public RequestBuilder setTransactionId(String transactionId) { + this.transactionId = transactionId; + return this; + + } + + /** + * Sets the path. + * + * @param path the path + * @return the request builder + */ + public RequestBuilder setPath(String path) { + + this.path = path; + return this; + + } + + /** + * Sets the restcore obj. + * + * @param restObj the restcore obj + * @return the request builder + */ + public RequestBuilder setRestObj(RestObject restObj) { + this.restObj = restObj; + return this; + + } + + /** + * Sets the old server. + * + * @param oldServer the old server + * @return the request builder + */ + public RequestBuilder setOldServer(boolean oldServer) { + this.oldServer = oldServer; + return this; + + } + + /** + * Sets the api version. + * + * @param apiVersion the api version + * @return the request builder + */ + public RequestBuilder setApiVersion(String apiVersion) { + this.apiVersion = apiVersion; + return this; + } + + /** + * Builds the. + * + * @return the request + */ + public Request build() { + return new Request(this); + } + + } + } diff --git a/aai-core/src/main/java/org/onap/aai/util/RestController.java b/aai-core/src/main/java/org/onap/aai/util/RestController.java index 20bb0a9b..a1419d14 100644 --- a/aai-core/src/main/java/org/onap/aai/util/RestController.java +++ b/aai-core/src/main/java/org/onap/aai/util/RestController.java @@ -17,15 +17,8 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.util; -import java.security.KeyManagementException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.logging.LoggingContext; +package org.onap.aai.util; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; @@ -35,402 +28,401 @@ import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientResponse; +import java.security.KeyManagementException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.logging.LoggingContext; + public class RestController implements RestControllerInterface { - private static final String TARGET_NAME = "AAI"; - private static EELFLogger LOGGER = EELFManager.getInstance().getLogger(RestController.class); - - private static Client client = null; - - private String restSrvrBaseURL; - - private String overrideLocalHost = null; - - //To do - Come up with helper function that will automatically - //generate the REST API path based on path parameter(s) and query parameter(s)! - public static final String REST_APIPATH_COMPLEXES = "cloud-infrastructure/complexes"; - public static final String REST_APIPATH_COMPLEX = "cloud-infrastructure/complexes/complex/"; - public static final String REST_APIPATH_PSERVERS = "cloud-infrastructure/pservers"; - public static final String REST_APIPATH_PSERVER = "cloud-infrastructure/pservers/pserver/"; - public static final String REST_APIPATH_PHYSICALLINKS = "network/physical-links/"; - public static final String REST_APIPATH_PHYSICALLINK = "network/physical-links/physical-link/"; - public static final String REST_APIPATH_PINTERFACES = "network/p-interfaces/"; - public static final String REST_APIPATH_PINTERFACE = "network/p-interfaces/p-interface/"; - public static final String REST_APIPATH_VPLSPES = "network/vpls-pes/"; - public static final String REST_APIPATH_VPLSPE = "network/vpls-pes/vpls-pe/"; - public static final String REST_APIPATH_UPDATE = "actions/update/"; - public static final String REST_APIPATH_SEARCH = "search/nodes-query?search-node-type="; - - public static final String REST_APIPATH_CLOUDREGION = "cloud-infrastructure/cloud-regions/cloud-region/"; - public static final String REST_APIPATH_TENANT = "cloud-infrastructure/tenants/tenant/"; - public static final String REST_APIPATH_VIRTUAL_DATA_CENTER = "cloud-infrastructure/virtual-data-centers/virtual-data-center/"; - public static final String REST_APIPATH_VIRTUAL_DATA_CENTERS = "cloud-infrastructure/virtual-data-centers/"; - public static final String REST_APIPATH_GENERIC_VNF = "network/generic-vnfs/generic-vnf/"; - public static final String REST_APIPATH_GENERIC_VNFS = "network/generic-vnfs"; - public static final String REST_APIPATH_L3_NETWORK = "network/l3-networks/l3-network/"; - public static final String REST_APIPATH_L3_NETWORKS = "network/l3-networks"; - public static final String REST_APIPATH_INSTANCE_GROUP = "network/instance-groups/instance-group"; - public static final String REST_APIPATH_INSTANCE_GROUPS = "network/instance-groups"; - public static final String REST_APIPATH_VFMODULE = "nodes/vf-modules/vf-module/"; - - public static final String REST_APIPATH_VCE = "network/vces/vce/"; - - public static final String REST_APIPATH_SERVICE = "service-design-and-creation/services/service/"; - public static final String REST_APIPATH_LOGICALLINKS = "network/logical-links/"; - public static final String REST_APIPATH_LOGICALLINK = "network/logical-links/logical-link/"; - - public RestController() throws AAIException { - this.initRestClient(); - } - /** - * Inits the rest client. - * - * @throws AAIException the AAI exception - */ - public void initRestClient() throws AAIException - { - if (client == null) { - try { - client = getHttpsAuthClient(); - } - catch (KeyManagementException e){ - throw new AAIException("AAI_7117", "KeyManagementException in REST call to DB: " + e.toString()); - } catch (Exception e) { - throw new AAIException("AAI_7117", " Exception in REST call to DB: " + e.toString()); - } - } - } - + private static final String TARGET_NAME = "AAI"; + private static EELFLogger LOGGER = EELFManager.getInstance().getLogger(RestController.class); + + private static Client client = null; + + private String restSrvrBaseURL; + + private String overrideLocalHost = null; + + // To do - Come up with helper function that will automatically + // generate the REST API path based on path parameter(s) and query parameter(s)! + public static final String REST_APIPATH_COMPLEXES = "cloud-infrastructure/complexes"; + public static final String REST_APIPATH_COMPLEX = "cloud-infrastructure/complexes/complex/"; + public static final String REST_APIPATH_PSERVERS = "cloud-infrastructure/pservers"; + public static final String REST_APIPATH_PSERVER = "cloud-infrastructure/pservers/pserver/"; + public static final String REST_APIPATH_PHYSICALLINKS = "network/physical-links/"; + public static final String REST_APIPATH_PHYSICALLINK = "network/physical-links/physical-link/"; + public static final String REST_APIPATH_PINTERFACES = "network/p-interfaces/"; + public static final String REST_APIPATH_PINTERFACE = "network/p-interfaces/p-interface/"; + public static final String REST_APIPATH_VPLSPES = "network/vpls-pes/"; + public static final String REST_APIPATH_VPLSPE = "network/vpls-pes/vpls-pe/"; + public static final String REST_APIPATH_UPDATE = "actions/update/"; + public static final String REST_APIPATH_SEARCH = "search/nodes-query?search-node-type="; + + public static final String REST_APIPATH_CLOUDREGION = "cloud-infrastructure/cloud-regions/cloud-region/"; + public static final String REST_APIPATH_TENANT = "cloud-infrastructure/tenants/tenant/"; + public static final String REST_APIPATH_VIRTUAL_DATA_CENTER = + "cloud-infrastructure/virtual-data-centers/virtual-data-center/"; + public static final String REST_APIPATH_VIRTUAL_DATA_CENTERS = "cloud-infrastructure/virtual-data-centers/"; + public static final String REST_APIPATH_GENERIC_VNF = "network/generic-vnfs/generic-vnf/"; + public static final String REST_APIPATH_GENERIC_VNFS = "network/generic-vnfs"; + public static final String REST_APIPATH_L3_NETWORK = "network/l3-networks/l3-network/"; + public static final String REST_APIPATH_L3_NETWORKS = "network/l3-networks"; + public static final String REST_APIPATH_INSTANCE_GROUP = "network/instance-groups/instance-group"; + public static final String REST_APIPATH_INSTANCE_GROUPS = "network/instance-groups"; + public static final String REST_APIPATH_VFMODULE = "nodes/vf-modules/vf-module/"; + + public static final String REST_APIPATH_VCE = "network/vces/vce/"; + + public static final String REST_APIPATH_SERVICE = "service-design-and-creation/services/service/"; + public static final String REST_APIPATH_LOGICALLINKS = "network/logical-links/"; + public static final String REST_APIPATH_LOGICALLINK = "network/logical-links/logical-link/"; + + public RestController() throws AAIException { + this.initRestClient(); + } + + /** + * Inits the rest client. + * + * @throws AAIException the AAI exception + */ + public void initRestClient() throws AAIException { + if (client == null) { + try { + client = getHttpsAuthClient(); + } catch (KeyManagementException e) { + throw new AAIException("AAI_7117", "KeyManagementException in REST call to DB: " + e.toString()); + } catch (Exception e) { + throw new AAIException("AAI_7117", " Exception in REST call to DB: " + e.toString()); + } + } + } + public Client getHttpsAuthClient() throws KeyManagementException { return HttpsAuthClient.getClient(); } - - /** - * Sets the rest srvr base URL. - * - * @param baseURL the base URL - * @throws AAIException the AAI exception - */ - public void SetRestSrvrBaseURL(String baseURL) throws AAIException - { - if (baseURL == null) - throw new AAIException("AAI_7117", "REST Server base URL cannot be null."); - restSrvrBaseURL = baseURL; - } - - /** - * Gets the rest srvr base URL. - * - * @return the rest srvr base URL - */ - public String getRestSrvrBaseURL() - { - return restSrvrBaseURL; - } - - - public void Get(T t, String sourceID, String transId, String path, RestObject restObject, boolean oldserver) throws AAIException { - Get(t, sourceID, transId, path, restObject, oldserver, AAIConstants.AAI_RESOURCES_PORT); - } - /** - * To do - optimization and automation. Also make it as generic as possible. - * - * @param the generic type - * @param t the t - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @param restObject the rest object - * @param oldserver the oldserver - * @throws AAIException the AAI exception - */ - @SuppressWarnings("unchecked") - public void Get(T t, String sourceID, String transId, String path, RestObject restObject, boolean oldserver, int port) throws AAIException { - String methodName = "Get"; - String url=""; - transId += ":" + UUID.randomUUID().toString(); - - LoggingContext.save(); - LoggingContext.partnerName(sourceID); - LoggingContext.targetEntity(TARGET_NAME); - LoggingContext.requestId(transId); - LoggingContext.serviceName(methodName); - LoggingContext.targetServiceName(methodName); - - LOGGER.debug(methodName + " start"); - - restObject.set(t); - - if (oldserver) { - url = AAIConfig.get(AAIConstants.AAI_OLDSERVER_URL) + path; - } else { - if ( overrideLocalHost == null ) { - overrideLocalHost = AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); - } - if ( AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost )) { - url = String.format(AAIConstants.AAI_LOCAL_REST, port, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } else { - url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } - } - initRestClient(); - LOGGER.debug(url + " for the get REST API"); - ClientResponse cres = client.resource(url) - .accept("application/json") - .header("X-TransactionId", transId) - .header("X-FromAppId", sourceID) - .header("Real-Time", "true") - .type("application/json") - .get(ClientResponse.class); - -// System.out.println("cres.EntityInputSream()="+cres.getEntityInputStream().toString()); -// System.out.println("cres.tostring()="+cres.toString()); - - if (cres.getStatus() == 200) { -// System.out.println(methodName + ": url=" + url); - t = (T) cres.getEntity(t.getClass()); - restObject.set(t); - LOGGER.debug(methodName + "REST api GET was successfull!"); - } else { - LoggingContext.restore(); -// System.out.println(methodName + ": url=" + url + " failed with status=" + cres.getStatus()); - throw new AAIException("AAI_7116", methodName +" with status="+cres.getStatus()+", url="+url); - } - - LoggingContext.restore(); - } - - /** - * To do - optimization and automation. Also make it as generic as possible. - * - * @param the generic type - * @param t the t - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @param restObject the rest object - * @param oldserver the oldserver - * @throws AAIException the AAI exception - */ - @SuppressWarnings("unchecked") - public void Get(T t, String sourceID, String transId, String path, RestObject restObject, String apiVersion) throws AAIException { - String methodName = "Get"; - String url=""; - transId += ":" + UUID.randomUUID().toString(); - - LoggingContext.save(); - LoggingContext.partnerName(sourceID); - LoggingContext.targetEntity(TARGET_NAME); - LoggingContext.requestId(transId); - LoggingContext.serviceName(methodName); - LoggingContext.targetServiceName(methodName); - - LOGGER.debug(methodName + " start"); - - restObject.set(t); - - url = AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE) + apiVersion + "/"+ path; - - initRestClient(); - LOGGER.debug(url + " for the get REST API"); - ClientResponse cres = client.resource(url) - .accept("application/json") - .header("X-TransactionId", transId) - .header("X-FromAppId", sourceID) - .header("Real-Time", "true") - .type("application/json") - .get(ClientResponse.class); - -// System.out.println("cres.EntityInputSream()="+cres.getEntityInputStream().toString()); -// System.out.println("cres.tostring()="+cres.toString()); - - if (cres.getStatus() == 200) { -// System.out.println(methodName + ": url=" + url); - t = (T) cres.getEntity(t.getClass()); - restObject.set(t); - LOGGER.debug(methodName + "REST api GET was successfull!"); - } else { - LoggingContext.restore(); -// System.out.println(methodName + ": url=" + url + " failed with status=" + cres.getStatus()); - throw new AAIException("AAI_7116", methodName +" with status="+cres.getStatus()+", url="+url); - } - - LoggingContext.restore(); - } - - /** - * Map json to object list. - * - * @param the generic type - * @param typeDef the type def - * @param json the json - * @param clazz the clazz - * @return the list - * @throws Exception the exception - */ - private List mapJsonToObjectList(T typeDef,String json, Class clazz) throws Exception - { - List list; - ObjectMapper mapper = new ObjectMapper(); - System.out.println(json); - TypeFactory t = TypeFactory.defaultInstance(); - list = mapper.readValue(json, t.constructCollectionType(ArrayList.class,clazz)); - - return list; - } - - /** - * Put. - * - * @param the generic type - * @param t the t - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @throws AAIException the AAI exception - */ - public void Put(T t, String sourceID, String transId, String path) throws AAIException { - Put( t, sourceID, transId, path, false, AAIConstants.AAI_RESOURCES_PORT); - } - - /** - * Put. - * - * @param the generic type - * @param t the t - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @throws AAIException the AAI exception - */ - public void Put(T t, String sourceID, String transId, String path, boolean oldserver) throws AAIException { - Put( t, sourceID, transId, path, oldserver, AAIConstants.AAI_RESOURCES_PORT); - } - - /** - * Put. - * - * @param the generic type - * @param t the t - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @param oldserver the oldserver - * @throws AAIException the AAI exception - */ - public void Put(T t, String sourceID, String transId, String path, boolean oldserver, int port) throws AAIException { - String methodName = "Put"; - String url=""; - transId += ":" + UUID.randomUUID().toString(); - - LoggingContext.save(); - LoggingContext.partnerName(sourceID); - LoggingContext.targetEntity(TARGET_NAME); - LoggingContext.requestId(transId); - LoggingContext.serviceName(methodName); - LoggingContext.targetServiceName(methodName); - - LOGGER.debug(methodName + " start"); - - initRestClient(); - - if (oldserver) { - url = AAIConfig.get(AAIConstants.AAI_OLDSERVER_URL) + path; - } else { - if ( overrideLocalHost == null ) { - overrideLocalHost = AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); - } - if ( AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost )) { - url = String.format(AAIConstants.AAI_LOCAL_REST, port, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } else { - url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } - } - - ClientResponse cres = client.resource(url) - .accept("application/json") - .header("X-TransactionId", transId) - .header("X-FromAppId", sourceID) - .header("Real-Time", "true") - .type("application/json") - .entity(t) - .put(ClientResponse.class); - -// System.out.println("cres.tostring()="+cres.toString()); - - int statuscode = cres.getStatus(); - if ( statuscode >= 200 && statuscode <= 299 ) { - LOGGER.debug(methodName+": url=" + url + ", request=" + path); - LoggingContext.restore(); - } else { - LoggingContext.restore(); - throw new AAIException("AAI_7116", methodName +" with status="+statuscode+", url="+url + ", msg=" + cres.getEntity(String.class)); - } - } - - public void Delete(String sourceID, String transId, String path) throws AAIException { - Delete(sourceID, transId, path, AAIConstants.AAI_RESOURCES_PORT); - } - /** - * Delete. - * - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @throws AAIException the AAI exception - */ - public void Delete(String sourceID, String transId, String path, int port) throws AAIException { - String methodName = "Delete"; - String url=""; - transId += ":" + UUID.randomUUID().toString(); - - LoggingContext.save(); - LoggingContext.partnerName(sourceID); - LoggingContext.targetEntity(TARGET_NAME); - LoggingContext.requestId(transId); - LoggingContext.serviceName(methodName); - LoggingContext.targetServiceName(methodName); - - LOGGER.debug(methodName + " start"); - - initRestClient(); - String request = "{}"; - if ( overrideLocalHost == null ) { - overrideLocalHost = AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); - } - if ( AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost )) { - url = String.format(AAIConstants.AAI_LOCAL_REST, port, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } else { - url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } - ClientResponse cres = client.resource(url) - .accept("application/json") - .header("X-TransactionId", transId) - .header("X-FromAppId", sourceID) - .header("Real-Time", "true") - .type("application/json") - .entity(request) - .delete(ClientResponse.class); - - if (cres.getStatus() == 404) { // resource not found - LOGGER.info("Resource does not exist...: " + cres.getStatus() - + ":" + cres.getEntity(String.class)); - LoggingContext.restore(); - } else if (cres.getStatus() == 200 || cres.getStatus() == 204){ - LOGGER.info("Resource " + url + " deleted"); - LoggingContext.restore(); - } else { - LOGGER.error("Deleting Resource failed: " + cres.getStatus() - + ":" + cres.getEntity(String.class)); - LoggingContext.restore(); + /** + * Sets the rest srvr base URL. + * + * @param baseURL the base URL + * @throws AAIException the AAI exception + */ + public void SetRestSrvrBaseURL(String baseURL) throws AAIException { + if (baseURL == null) + throw new AAIException("AAI_7117", "REST Server base URL cannot be null."); + restSrvrBaseURL = baseURL; + } + + /** + * Gets the rest srvr base URL. + * + * @return the rest srvr base URL + */ + public String getRestSrvrBaseURL() { + return restSrvrBaseURL; + } + + public void Get(T t, String sourceID, String transId, String path, RestObject restObject, boolean oldserver) + throws AAIException { + Get(t, sourceID, transId, path, restObject, oldserver, AAIConstants.AAI_RESOURCES_PORT); + } + + /** + * To do - optimization and automation. Also make it as generic as possible. + * + * @param the generic type + * @param t the t + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @param restObject the rest object + * @param oldserver the oldserver + * @throws AAIException the AAI exception + */ + @SuppressWarnings("unchecked") + public void Get(T t, String sourceID, String transId, String path, RestObject restObject, boolean oldserver, + int port) throws AAIException { + String methodName = "Get"; + String url = ""; + transId += ":" + UUID.randomUUID().toString(); + + LoggingContext.save(); + LoggingContext.partnerName(sourceID); + LoggingContext.targetEntity(TARGET_NAME); + LoggingContext.requestId(transId); + LoggingContext.serviceName(methodName); + LoggingContext.targetServiceName(methodName); + + LOGGER.debug(methodName + " start"); + + restObject.set(t); + + if (oldserver) { + url = AAIConfig.get(AAIConstants.AAI_OLDSERVER_URL) + path; + } else { + if (overrideLocalHost == null) { + overrideLocalHost = + AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); + } + if (AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost)) { + url = String.format(AAIConstants.AAI_LOCAL_REST, port, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } else { + url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } + } + initRestClient(); + LOGGER.debug(url + " for the get REST API"); + ClientResponse cres = client.resource(url).accept("application/json").header("X-TransactionId", transId) + .header("X-FromAppId", sourceID).header("Real-Time", "true").type("application/json") + .get(ClientResponse.class); + + // System.out.println("cres.EntityInputSream()="+cres.getEntityInputStream().toString()); + // System.out.println("cres.tostring()="+cres.toString()); + + if (cres.getStatus() == 200) { + // System.out.println(methodName + ": url=" + url); + t = (T) cres.getEntity(t.getClass()); + restObject.set(t); + LOGGER.debug(methodName + "REST api GET was successfull!"); + } else { + LoggingContext.restore(); + // System.out.println(methodName + ": url=" + url + " failed with status=" + cres.getStatus()); + throw new AAIException("AAI_7116", methodName + " with status=" + cres.getStatus() + ", url=" + url); + } + + LoggingContext.restore(); + } + + /** + * To do - optimization and automation. Also make it as generic as possible. + * + * @param the generic type + * @param t the t + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @param restObject the rest object + * @param oldserver the oldserver + * @throws AAIException the AAI exception + */ + @SuppressWarnings("unchecked") + public void Get(T t, String sourceID, String transId, String path, RestObject restObject, String apiVersion) + throws AAIException { + String methodName = "Get"; + String url = ""; + transId += ":" + UUID.randomUUID().toString(); + + LoggingContext.save(); + LoggingContext.partnerName(sourceID); + LoggingContext.targetEntity(TARGET_NAME); + LoggingContext.requestId(transId); + LoggingContext.serviceName(methodName); + LoggingContext.targetServiceName(methodName); + + LOGGER.debug(methodName + " start"); + + restObject.set(t); + + url = AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE) + apiVersion + "/" + path; + + initRestClient(); + LOGGER.debug(url + " for the get REST API"); + ClientResponse cres = client.resource(url).accept("application/json").header("X-TransactionId", transId) + .header("X-FromAppId", sourceID).header("Real-Time", "true").type("application/json") + .get(ClientResponse.class); + + // System.out.println("cres.EntityInputSream()="+cres.getEntityInputStream().toString()); + // System.out.println("cres.tostring()="+cres.toString()); + + if (cres.getStatus() == 200) { + // System.out.println(methodName + ": url=" + url); + t = (T) cres.getEntity(t.getClass()); + restObject.set(t); + LOGGER.debug(methodName + "REST api GET was successfull!"); + } else { + LoggingContext.restore(); + // System.out.println(methodName + ": url=" + url + " failed with status=" + cres.getStatus()); + throw new AAIException("AAI_7116", methodName + " with status=" + cres.getStatus() + ", url=" + url); + } + + LoggingContext.restore(); + } + + /** + * Map json to object list. + * + * @param the generic type + * @param typeDef the type def + * @param json the json + * @param clazz the clazz + * @return the list + * @throws Exception the exception + */ + private List mapJsonToObjectList(T typeDef, String json, Class clazz) throws Exception { + List list; + ObjectMapper mapper = new ObjectMapper(); + System.out.println(json); + TypeFactory t = TypeFactory.defaultInstance(); + list = mapper.readValue(json, t.constructCollectionType(ArrayList.class, clazz)); + + return list; + } + + /** + * Put. + * + * @param the generic type + * @param t the t + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @throws AAIException the AAI exception + */ + public void Put(T t, String sourceID, String transId, String path) throws AAIException { + Put(t, sourceID, transId, path, false, AAIConstants.AAI_RESOURCES_PORT); + } + + /** + * Put. + * + * @param the generic type + * @param t the t + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @throws AAIException the AAI exception + */ + public void Put(T t, String sourceID, String transId, String path, boolean oldserver) throws AAIException { + Put(t, sourceID, transId, path, oldserver, AAIConstants.AAI_RESOURCES_PORT); + } + + /** + * Put. + * + * @param the generic type + * @param t the t + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @param oldserver the oldserver + * @throws AAIException the AAI exception + */ + public void Put(T t, String sourceID, String transId, String path, boolean oldserver, int port) + throws AAIException { + String methodName = "Put"; + String url = ""; + transId += ":" + UUID.randomUUID().toString(); + + LoggingContext.save(); + LoggingContext.partnerName(sourceID); + LoggingContext.targetEntity(TARGET_NAME); + LoggingContext.requestId(transId); + LoggingContext.serviceName(methodName); + LoggingContext.targetServiceName(methodName); + + LOGGER.debug(methodName + " start"); + + initRestClient(); + + if (oldserver) { + url = AAIConfig.get(AAIConstants.AAI_OLDSERVER_URL) + path; + } else { + if (overrideLocalHost == null) { + overrideLocalHost = + AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); + } + if (AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost)) { + url = String.format(AAIConstants.AAI_LOCAL_REST, port, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } else { + url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } + } + + ClientResponse cres = client.resource(url).accept("application/json").header("X-TransactionId", transId) + .header("X-FromAppId", sourceID).header("Real-Time", "true").type("application/json").entity(t) + .put(ClientResponse.class); + + // System.out.println("cres.tostring()="+cres.toString()); + + int statuscode = cres.getStatus(); + if (statuscode >= 200 && statuscode <= 299) { + LOGGER.debug(methodName + ": url=" + url + ", request=" + path); + LoggingContext.restore(); + } else { + LoggingContext.restore(); + throw new AAIException("AAI_7116", methodName + " with status=" + statuscode + ", url=" + url + ", msg=" + + cres.getEntity(String.class)); + } + } + + public void Delete(String sourceID, String transId, String path) throws AAIException { + Delete(sourceID, transId, path, AAIConstants.AAI_RESOURCES_PORT); + } + + /** + * Delete. + * + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @throws AAIException the AAI exception + */ + public void Delete(String sourceID, String transId, String path, int port) throws AAIException { + String methodName = "Delete"; + String url = ""; + transId += ":" + UUID.randomUUID().toString(); + + LoggingContext.save(); + LoggingContext.partnerName(sourceID); + LoggingContext.targetEntity(TARGET_NAME); + LoggingContext.requestId(transId); + LoggingContext.serviceName(methodName); + LoggingContext.targetServiceName(methodName); + + LOGGER.debug(methodName + " start"); + + initRestClient(); + String request = "{}"; + if (overrideLocalHost == null) { + overrideLocalHost = AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); + } + if (AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost)) { + url = String.format(AAIConstants.AAI_LOCAL_REST, port, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } else { + url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } + ClientResponse cres = client.resource(url).accept("application/json").header("X-TransactionId", transId) + .header("X-FromAppId", sourceID).header("Real-Time", "true").type("application/json").entity(request) + .delete(ClientResponse.class); + + if (cres.getStatus() == 404) { // resource not found + LOGGER.info("Resource does not exist...: " + cres.getStatus() + ":" + cres.getEntity(String.class)); + LoggingContext.restore(); + } else if (cres.getStatus() == 200 || cres.getStatus() == 204) { + LOGGER.info("Resource " + url + " deleted"); + LoggingContext.restore(); + } else { + LOGGER.error("Deleting Resource failed: " + cres.getStatus() + ":" + cres.getEntity(String.class)); + LoggingContext.restore(); throw new AAIException("AAI_7116", "Error during DELETE"); - } - } - - public String Post(T t, String sourceID, String transId, String path) throws Exception { - return Post(t, sourceID, transId, path, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)); - } + } + } + + public String Post(T t, String sourceID, String transId, String path) throws Exception { + return Post(t, sourceID, transId, path, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)); + } + /** * Post. * @@ -443,55 +435,48 @@ public class RestController implements RestControllerInterface { * @return the string * @throws Exception the exception */ - public String Post(T t, String sourceID, String transId, String path, String apiVersion) throws Exception { + public String Post(T t, String sourceID, String transId, String path, String apiVersion) throws Exception { String methodName = "Post"; - String url=""; + String url = ""; transId += ":" + UUID.randomUUID().toString(); - + LoggingContext.save(); LoggingContext.partnerName(sourceID); - LoggingContext.targetEntity(TARGET_NAME); - LoggingContext.requestId(transId); - LoggingContext.serviceName(methodName); - LoggingContext.targetServiceName(methodName); - - LOGGER.debug(methodName + " start"); - + LoggingContext.targetEntity(TARGET_NAME); + LoggingContext.requestId(transId); + LoggingContext.serviceName(methodName); + LoggingContext.targetServiceName(methodName); + + LOGGER.debug(methodName + " start"); + try { - - initRestClient(); + + initRestClient(); url = AAIConfig.get(AAIConstants.AAI_SERVER_URL_BASE) + apiVersion + "/" + path; - - ClientResponse cres = client.resource(url) - .accept("application/json") - .header("X-TransactionId", transId) - .header("X-FromAppId", sourceID) - .header("Real-Time", "true") - .type("application/json") - .entity(t) - .post(ClientResponse.class); - + + ClientResponse cres = client.resource(url).accept("application/json").header("X-TransactionId", transId) + .header("X-FromAppId", sourceID).header("Real-Time", "true").type("application/json").entity(t) + .post(ClientResponse.class); + int statuscode = cres.getStatus(); - if ( statuscode >= 200 && statuscode <= 299 ) { - LOGGER.debug(methodName + "REST api POST was successful!"); - return cres.getEntity(String.class); - } else { - throw new AAIException("AAI_7116", methodName +" with status="+statuscode+", url="+url + ", msg=" + cres.getEntity(String.class)); - } - + if (statuscode >= 200 && statuscode <= 299) { + LOGGER.debug(methodName + "REST api POST was successful!"); + return cres.getEntity(String.class); + } else { + throw new AAIException("AAI_7116", methodName + " with status=" + statuscode + ", url=" + url + ", msg=" + + cres.getEntity(String.class)); + } + } catch (AAIException e) { - throw new AAIException("AAI_7116", methodName + " with url="+url+ ", Exception: " + e.toString()); - } catch (Exception e) - { - throw new AAIException("AAI_7116", methodName + " with url="+url+ ", Exception: " + e.toString()); - - } - finally { - LoggingContext.restore(); + throw new AAIException("AAI_7116", methodName + " with url=" + url + ", Exception: " + e.toString()); + } catch (Exception e) { + throw new AAIException("AAI_7116", methodName + " with url=" + url + ", Exception: " + e.toString()); + + } finally { + LoggingContext.restore(); } } - /** * Gets the single instance of RestController. * @@ -501,11 +486,10 @@ public class RestController implements RestControllerInterface { * @throws IllegalAccessException the illegal access exception * @throws InstantiationException the instantiation exception */ - public T getInstance(Class clazz) throws IllegalAccessException, InstantiationException - { - return clazz.newInstance(); - } - + public T getInstance(Class clazz) throws IllegalAccessException, InstantiationException { + return clazz.newInstance(); + } + /** * Does resource exist. * @@ -517,122 +501,120 @@ public class RestController implements RestControllerInterface { * @return the t */ /* - * DoesResourceExist - * - * To check whether a resource exist or get a copy of the existing version of the resource - * - * Resourcepath: should contain the qualified resource path (including encoded unique key identifier value), - * resourceClassName: is the canonical name of the resource class name, - * fromAppId: - * transId: - * - * Will return null (if the resource doesn’t exist) (or) - * Will return the specified resource from the Graph. - * - * Example: - * LogicalLink llink = new LogicalLink(); - * String resourceClassName = llink.getClass().getCanonicalName(); - * llink = RestController.DoesResourceExist("network/logical-links/logical-link/" + , resourceClassName, fromAppId, transId); - */ - public T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId) { - - try { - - RestObject restObj = new RestObject(); - @SuppressWarnings("unchecked") - T resourceObj = (T)getInstance(Class.forName(resourceClassName)); - restObj.set(resourceObj); - Get(resourceObj, fromAppId, transId, resourcePath, restObj, false, AAIConstants.AAI_RESOURCES_PORT); - - resourceObj = restObj.get(); - if (resourceObj != null) - return resourceObj; - - } catch (AAIException e) { - - } catch (ClientHandlerException che) { - - }catch (Exception e) { - - } - - return null; - } - - /** - * Patch. - * - * @param the generic type - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @throws AAIException the AAI exception - */ - public void Patch(T t, String sourceID, String transId, String path) throws AAIException { - String methodName = "Patch"; - String url=""; - transId += ":" + UUID.randomUUID().toString(); - - LoggingContext.save(); - LoggingContext.partnerName(sourceID); - LoggingContext.targetEntity(TARGET_NAME); - LoggingContext.requestId(transId); - LoggingContext.serviceName(methodName); - LoggingContext.targetServiceName(methodName); - - - int numRetries = 5; - ClientResponse cres = null; - int statusCode = -1; - - try { - if ( overrideLocalHost == null ) { - overrideLocalHost = AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); - } - if ( AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost )) { - url = String.format(AAIConstants.AAI_LOCAL_REST, AAIConstants.AAI_RESOURCES_PORT, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } else { - url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; - } - - initRestClient(); - do { - - cres = client.resource(url) - .accept("application/json") - .header("X-TransactionId", transId) - .header("X-FromAppId", sourceID) - .header("X-HTTP-Method-Override", "PATCH") - .type("application/merge-patch+json") - .entity(t) - .post(ClientResponse.class); - - statusCode = cres.getStatus(); - - if ( statusCode >= 200 && statusCode <= 299 ) { - LOGGER.debug(methodName + "REST api PATCH was successful!"); - return; - } else { - LOGGER.debug(methodName + "Unable to make the patch request to url " + url + " so retrying"); - } - - numRetries--; - - } while(numRetries >= 0); - - LOGGER.debug(methodName + "Unable to make the patch request to url " + url + " even after trying = " + numRetries + " times."); - throw new AAIException("AAI_7116", methodName +" with status="+statusCode+", url="+url + ", msg=" + cres.getEntity(String.class)); - - } catch (AAIException e) { - throw new AAIException("AAI_7116", methodName + " with url="+url+ ", Exception: " + e.toString()); - } catch (Exception e) - { - throw new AAIException("AAI_7116", methodName + " with url="+url+ ", Exception: " + e.toString()); - - } - finally { - LoggingContext.restore(); - } - - } + * DoesResourceExist + * + * To check whether a resource exist or get a copy of the existing version of the resource + * + * Resourcepath: should contain the qualified resource path (including encoded unique key identifier value), + * resourceClassName: is the canonical name of the resource class name, + * fromAppId: + * transId: + * + * Will return null (if the resource doesn’t exist) (or) + * Will return the specified resource from the Graph. + * + * Example: + * LogicalLink llink = new LogicalLink(); + * String resourceClassName = llink.getClass().getCanonicalName(); + * llink = RestController.DoesResourceExist("network/logical-links/logical-link/" + , + * resourceClassName, fromAppId, transId); + */ + public T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId) { + + try { + + RestObject restObj = new RestObject(); + @SuppressWarnings("unchecked") + T resourceObj = (T) getInstance(Class.forName(resourceClassName)); + restObj.set(resourceObj); + Get(resourceObj, fromAppId, transId, resourcePath, restObj, false, AAIConstants.AAI_RESOURCES_PORT); + + resourceObj = restObj.get(); + if (resourceObj != null) + return resourceObj; + + } catch (AAIException e) { + + } catch (ClientHandlerException che) { + + } catch (Exception e) { + + } + + return null; + } + + /** + * Patch. + * + * @param the generic type + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @throws AAIException the AAI exception + */ + public void Patch(T t, String sourceID, String transId, String path) throws AAIException { + String methodName = "Patch"; + String url = ""; + transId += ":" + UUID.randomUUID().toString(); + + LoggingContext.save(); + LoggingContext.partnerName(sourceID); + LoggingContext.targetEntity(TARGET_NAME); + LoggingContext.requestId(transId); + LoggingContext.serviceName(methodName); + LoggingContext.targetServiceName(methodName); + + int numRetries = 5; + ClientResponse cres = null; + int statusCode = -1; + + try { + if (overrideLocalHost == null) { + overrideLocalHost = + AAIConfig.get(AAIConstants.AAI_LOCAL_OVERRIDE, AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT); + } + if (AAIConstants.AAI_LOCAL_OVERRIDE_DEFAULT.equals(overrideLocalHost)) { + url = String.format(AAIConstants.AAI_LOCAL_REST, AAIConstants.AAI_RESOURCES_PORT, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } else { + url = String.format(AAIConstants.AAI_LOCAL_REST_OVERRIDE, overrideLocalHost, + AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP)) + path; + } + + initRestClient(); + do { + + cres = client.resource(url).accept("application/json").header("X-TransactionId", transId) + .header("X-FromAppId", sourceID).header("X-HTTP-Method-Override", "PATCH") + .type("application/merge-patch+json").entity(t).post(ClientResponse.class); + + statusCode = cres.getStatus(); + + if (statusCode >= 200 && statusCode <= 299) { + LOGGER.debug(methodName + "REST api PATCH was successful!"); + return; + } else { + LOGGER.debug(methodName + "Unable to make the patch request to url " + url + " so retrying"); + } + + numRetries--; + + } while (numRetries >= 0); + + LOGGER.debug(methodName + "Unable to make the patch request to url " + url + " even after trying = " + + numRetries + " times."); + throw new AAIException("AAI_7116", methodName + " with status=" + statusCode + ", url=" + url + ", msg=" + + cres.getEntity(String.class)); + + } catch (AAIException e) { + throw new AAIException("AAI_7116", methodName + " with url=" + url + ", Exception: " + e.toString()); + } catch (Exception e) { + throw new AAIException("AAI_7116", methodName + " with url=" + url + ", Exception: " + e.toString()); + + } finally { + LoggingContext.restore(); + } + + } } diff --git a/aai-core/src/main/java/org/onap/aai/util/RestControllerInterface.java b/aai-core/src/main/java/org/onap/aai/util/RestControllerInterface.java index d7061188..f5eed42d 100644 --- a/aai-core/src/main/java/org/onap/aai/util/RestControllerInterface.java +++ b/aai-core/src/main/java/org/onap/aai/util/RestControllerInterface.java @@ -17,17 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.util; -import org.onap.aai.util.RestObject; +package org.onap.aai.util; import org.onap.aai.exceptions.AAIException; +import org.onap.aai.util.RestObject; public interface RestControllerInterface { - public void Get(T t, String sourceID, String transId, String path, RestObject restObject, boolean oldserver) throws AAIException; + public void Get(T t, String sourceID, String transId, String path, RestObject restObject, boolean oldserver) + throws AAIException; - public void Get(T t, String sourceID, String transId, String path, RestObject restObject, String apiVersion) throws AAIException; + public void Get(T t, String sourceID, String transId, String path, RestObject restObject, String apiVersion) + throws AAIException; public void Patch(T t, String sourceID, String transId, String path) throws AAIException; @@ -39,5 +41,5 @@ public interface RestControllerInterface { public T getInstance(Class clazz) throws IllegalAccessException, InstantiationException; - public T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId) ; -} \ No newline at end of file + public T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId); +} diff --git a/aai-core/src/main/java/org/onap/aai/util/RestObject.java b/aai-core/src/main/java/org/onap/aai/util/RestObject.java index f367c2e6..a45bfeb0 100644 --- a/aai-core/src/main/java/org/onap/aai/util/RestObject.java +++ b/aai-core/src/main/java/org/onap/aai/util/RestObject.java @@ -17,14 +17,16 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; public class RestObject { - /** - * Generic version of the RestObject class. - * @param the type of the value being called for the Rest object interface - */ + /** + * Generic version of the RestObject class. + * + * @param the type of the value being called for the Rest object interface + */ // T stands for "Type" private T t; @@ -33,13 +35,17 @@ public class RestObject { * * @param t the t */ - public void set(T t) { this.t = t; } - + public void set(T t) { + this.t = t; + } + /** * Gets the. * * @return the t */ - public T get() { return t; } - + public T get() { + return t; + } + } diff --git a/aai-core/src/main/java/org/onap/aai/util/RestURLEncoder.java b/aai-core/src/main/java/org/onap/aai/util/RestURLEncoder.java index 94cce9b7..c6d2b7cf 100644 --- a/aai-core/src/main/java/org/onap/aai/util/RestURLEncoder.java +++ b/aai-core/src/main/java/org/onap/aai/util/RestURLEncoder.java @@ -17,24 +17,23 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import java.io.UnsupportedEncodingException; -import org.springframework.web.util.UriUtils; +import org.springframework.web.util.UriUtils; public class RestURLEncoder { - - /** - * Encode URL. - * - * @param nodeKey the node key - * @return the string - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - public static final String encodeURL (String nodeKey) throws UnsupportedEncodingException { - return UriUtils.encode(nodeKey, "UTF-8").replaceAll("\\+", "%20"); - } + /** + * Encode URL. + * + * @param nodeKey the node key + * @return the string + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + public static final String encodeURL(String nodeKey) throws UnsupportedEncodingException { + return UriUtils.encode(nodeKey, "UTF-8").replaceAll("\\+", "%20"); + } } - diff --git a/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java b/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java index 1f3341b8..8b2bf50a 100644 --- a/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java +++ b/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java @@ -17,16 +17,18 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.StringWriter; import java.util.Iterator; import java.util.UUID; import javax.xml.bind.Marshaller; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; import org.eclipse.persistence.dynamic.DynamicEntity; import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; import org.json.JSONException; @@ -44,311 +46,316 @@ import org.springframework.core.env.Environment; public class StoreNotificationEvent { private static final EELFLogger logger = EELFManager.getInstance().getLogger(StoreNotificationEvent.class); - - private MessageProducer messageProducer; - private String fromAppId = ""; - private String transId = ""; - private final String transactionId; - private final String sourceOfTruth; - - private ApplicationContext context; - private Environment env; - - /** - * Instantiates a new store notification event. - */ - public StoreNotificationEvent(String transactionId, String sourceOfTruth) { - this.messageProducer = new AAIDmaapEventJMSProducer(); - this.transactionId = transactionId; - this.sourceOfTruth = sourceOfTruth; - } - - public StoreNotificationEvent(AAIDmaapEventJMSProducer producer, String transactionId, String sourceOfTruth) { - this.messageProducer = producer; - this.transactionId = transactionId; - this.sourceOfTruth = sourceOfTruth; - } - - /** - * Store event. - * - * @param eh - * the eh - * @param obj - * the obj - * @throws AAIException - * the AAI exception - */ - public String storeEvent(NotificationEvent.EventHeader eh, Object obj) throws AAIException { - - if (obj == null) { - throw new AAIException("AAI_7350"); - } - - org.onap.aai.domain.notificationEvent.ObjectFactory factory = new org.onap.aai.domain.notificationEvent.ObjectFactory(); - - org.onap.aai.domain.notificationEvent.NotificationEvent ne = factory.createNotificationEvent(); - - if (eh.getId() == null) { - eh.setId(genDate2() + "-" + UUID.randomUUID().toString()); - } - if (eh.getTimestamp() == null) { - eh.setTimestamp(genDate()); - } - - // there's no default, but i think we want to put this in hbase? - - if (eh.getEntityLink() == null) { - eh.setEntityLink("UNK"); - } - - if (eh.getAction() == null) { - eh.setAction("UNK"); - } - - if (eh.getEventType() == null) { - eh.setEventType(AAIConfig.get("aai.notificationEvent.default.eventType", "UNK")); - } - - if (eh.getDomain() == null) { - eh.setDomain(AAIConfig.get("aai.notificationEvent.default.domain", "UNK")); - } - - if (eh.getSourceName() == null) { - eh.setSourceName(AAIConfig.get("aai.notificationEvent.default.sourceName", "UNK")); - } - - if (eh.getSequenceNumber() == null) { - eh.setSequenceNumber(AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK")); - } - - if (eh.getSeverity() == null) { - eh.setSeverity(AAIConfig.get("aai.notificationEvent.default.severity", "UNK")); - } - - if (eh.getVersion() == null) { - eh.setVersion(AAIConfig.get("aai.notificationEvent.default.version", "UNK")); - } - - ne.setCambriaPartition(AAIConstants.UEB_PUB_PARTITION_AAI); - ne.setEventHeader(eh); - ne.setEntity(obj); - - try { - PojoUtils pu = new PojoUtils(); - String entityJson = pu.getJsonFromObject(ne); - sendToDmaapJmsQueue(entityJson); - return entityJson; - } catch (Exception e) { - throw new AAIException("AAI_7350", e); - } - } - - /** - * Store dynamic event. - * - * @param notificationJaxbContext - * the notification jaxb context - * @param notificationVersion - * the notification version - * @param eventHeader - * the event header - * @param obj - * the obj - * @throws AAIException - * the AAI exception - */ - public void storeDynamicEvent(DynamicJAXBContext notificationJaxbContext, String notificationVersion, DynamicEntity eventHeader, DynamicEntity obj) throws AAIException { - - if (obj == null) { - throw new AAIException("AAI_7350"); - } - - DynamicEntity notificationEvent = notificationJaxbContext.getDynamicType("inventory.aai.onap.org." + notificationVersion + ".NotificationEvent").newDynamicEntity(); - - if (eventHeader.get("id") == null) { - eventHeader.set("id", genDate2() + "-" + UUID.randomUUID().toString()); - } - - if (eventHeader.get("timestamp") == null) { - eventHeader.set("timestamp", genDate()); - } - - if (eventHeader.get("entityLink") == null) { - eventHeader.set("entityLink", "UNK"); - } - - if (eventHeader.get("action") == null) { - eventHeader.set("action", "UNK"); - } - - if (eventHeader.get("eventType") == null) { - eventHeader.set("eventType", AAIConfig.get("aai.notificationEvent.default.eventType", "UNK")); - } - - if (eventHeader.get("domain") == null) { - eventHeader.set("domain", AAIConfig.get("aai.notificationEvent.default.domain", "UNK")); - } - - if (eventHeader.get("sourceName") == null) { - eventHeader.set("sourceName", AAIConfig.get("aai.notificationEvent.default.sourceName", "UNK")); - } - - if (eventHeader.get("sequenceNumber") == null) { - eventHeader.set("sequenceNumber", AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK")); - } - - if (eventHeader.get("severity") == null) { - eventHeader.set("severity", AAIConfig.get("aai.notificationEvent.default.severity", "UNK")); - } - - if (eventHeader.get("version") == null) { - eventHeader.set("version", AAIConfig.get("aai.notificationEvent.default.version", "UNK")); - } - - if (notificationEvent.get("cambriaPartition") == null) { - notificationEvent.set("cambriaPartition", AAIConstants.UEB_PUB_PARTITION_AAI); - } - - notificationEvent.set("eventHeader", eventHeader); - notificationEvent.set("entity", obj); - - try { - StringWriter result = new StringWriter(); - - Marshaller marshaller = notificationJaxbContext.createMarshaller(); - marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.MEDIA_TYPE, "application/json"); - marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_INCLUDE_ROOT, false); - marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, false); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false); - marshaller.marshal(notificationEvent, result); - this.sendToDmaapJmsQueue(result.toString()); - - } catch (Exception e) { - throw new AAIException("AAI_7350", e); - } - } - - public String storeEvent(Loader loader, Introspector eventHeader, Introspector obj) throws AAIException { - if (obj == null) { - throw new AAIException("AAI_7350"); - } - - try { - final Introspector notificationEvent = loader.introspectorFromName("notification-event"); - - if (eventHeader.getValue("id") == null) { - eventHeader.setValue("id", genDate2() + "-" + UUID.randomUUID().toString()); - } - - if (eventHeader.getValue("timestamp") == null) { - eventHeader.setValue("timestamp", genDate()); - } - - if (eventHeader.getValue("entity-link") == null) { - eventHeader.setValue("entity-link", "UNK"); - } - - if (eventHeader.getValue("action") == null) { - eventHeader.setValue("action", "UNK"); - } - - if (eventHeader.getValue("event-type") == null) { - eventHeader.setValue("event-type", AAIConfig.get("aai.notificationEvent.default.eventType", "UNK")); - } - - if (eventHeader.getValue("domain") == null) { - eventHeader.setValue("domain", AAIConfig.get("aai.notificationEvent.default.domain", "UNK")); - } - - if (eventHeader.getValue("source-name") == null) { - eventHeader.setValue("source-name", AAIConfig.get("aai.notificationEvent.default.sourceName", "UNK")); - } - - if (eventHeader.getValue("sequence-number") == null) { - eventHeader.setValue("sequence-number", AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK")); - } - - if (eventHeader.getValue("severity") == null) { - eventHeader.setValue("severity", AAIConfig.get("aai.notificationEvent.default.severity", "UNK")); - } - - if (eventHeader.getValue("version") == null) { - eventHeader.setValue("version", AAIConfig.get("aai.notificationEvent.default.version", "UNK")); - } - - if (notificationEvent.getValue("cambria-partition") == null) { - notificationEvent.setValue("cambria-partition", AAIConfig.get("aai.notificationEvent.default.partition", AAIConstants.UEB_PUB_PARTITION_AAI)); - } - - notificationEvent.setValue("event-header", eventHeader.getUnderlyingObject()); - notificationEvent.setValue("entity", obj.getUnderlyingObject()); - - String entityJson = notificationEvent.marshal(false); - sendToDmaapJmsQueue(entityJson); - return entityJson; - } catch (JSONException e) { - throw new AAIException("AAI_7350", e); - } catch (AAIUnknownObjectException e) { - throw new AAIException("AAI_7350", e); - } - } - - private void sendToDmaapJmsQueue(String entityString) throws JSONException { - - - JSONObject entityJsonObject = new JSONObject(entityString); - - JSONObject entityJsonObjectUpdated = new JSONObject(); - JSONObject finalJson = new JSONObject(); - - JSONObject entityHeader = entityJsonObject.getJSONObject("event-header"); - String cambriaPartition = entityJsonObject.getString("cambria.partition"); - - entityJsonObject.remove("event-header"); - entityJsonObject.remove("cambria.partition"); - - entityJsonObjectUpdated.put("event-header", entityHeader); - entityJsonObjectUpdated.put("cambria.partition", cambriaPartition); - - String transId = entityHeader.getString("id"); - String fromAppId = entityHeader.getString("source-name"); - - Iterator iter = entityJsonObject.keys(); - JSONObject entity = new JSONObject(); - if (iter.hasNext()) { - entity = entityJsonObject.getJSONObject(iter.next()); - } - - entityJsonObjectUpdated.put("entity", entity); - - finalJson.put("event-topic", "AAI-EVENT"); - finalJson.put("transId", transId); - finalJson.put("fromAppId", fromAppId); - finalJson.put("fullId", ""); - finalJson.put("aaiEventPayload", entityJsonObjectUpdated); - - messageProducer.sendMessageToDefaultDestination(finalJson); - } - - /** - * Gen date. - * - * @return the string - */ - public static String genDate() { - FormatDate fd = new FormatDate("YYYYMMdd-HH:mm:ss:SSS"); - return fd.getDateTime(); - } - - /** - * Gen date 2. - * - * @return the string - */ - public static String genDate2() { - FormatDate fd = new FormatDate("YYYYMMddHHmmss"); - return fd.getDateTime(); - } + + private MessageProducer messageProducer; + private String fromAppId = ""; + private String transId = ""; + private final String transactionId; + private final String sourceOfTruth; + + private ApplicationContext context; + private Environment env; + + /** + * Instantiates a new store notification event. + */ + public StoreNotificationEvent(String transactionId, String sourceOfTruth) { + this.messageProducer = new AAIDmaapEventJMSProducer(); + this.transactionId = transactionId; + this.sourceOfTruth = sourceOfTruth; + } + + public StoreNotificationEvent(AAIDmaapEventJMSProducer producer, String transactionId, String sourceOfTruth) { + this.messageProducer = producer; + this.transactionId = transactionId; + this.sourceOfTruth = sourceOfTruth; + } + + /** + * Store event. + * + * @param eh + * the eh + * @param obj + * the obj + * @throws AAIException + * the AAI exception + */ + public String storeEvent(NotificationEvent.EventHeader eh, Object obj) throws AAIException { + + if (obj == null) { + throw new AAIException("AAI_7350"); + } + + org.onap.aai.domain.notificationEvent.ObjectFactory factory = + new org.onap.aai.domain.notificationEvent.ObjectFactory(); + + org.onap.aai.domain.notificationEvent.NotificationEvent ne = factory.createNotificationEvent(); + + if (eh.getId() == null) { + eh.setId(genDate2() + "-" + UUID.randomUUID().toString()); + } + if (eh.getTimestamp() == null) { + eh.setTimestamp(genDate()); + } + + // there's no default, but i think we want to put this in hbase? + + if (eh.getEntityLink() == null) { + eh.setEntityLink("UNK"); + } + + if (eh.getAction() == null) { + eh.setAction("UNK"); + } + + if (eh.getEventType() == null) { + eh.setEventType(AAIConfig.get("aai.notificationEvent.default.eventType", "UNK")); + } + + if (eh.getDomain() == null) { + eh.setDomain(AAIConfig.get("aai.notificationEvent.default.domain", "UNK")); + } + + if (eh.getSourceName() == null) { + eh.setSourceName(AAIConfig.get("aai.notificationEvent.default.sourceName", "UNK")); + } + + if (eh.getSequenceNumber() == null) { + eh.setSequenceNumber(AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK")); + } + + if (eh.getSeverity() == null) { + eh.setSeverity(AAIConfig.get("aai.notificationEvent.default.severity", "UNK")); + } + + if (eh.getVersion() == null) { + eh.setVersion(AAIConfig.get("aai.notificationEvent.default.version", "UNK")); + } + + ne.setCambriaPartition(AAIConstants.UEB_PUB_PARTITION_AAI); + ne.setEventHeader(eh); + ne.setEntity(obj); + + try { + PojoUtils pu = new PojoUtils(); + String entityJson = pu.getJsonFromObject(ne); + sendToDmaapJmsQueue(entityJson); + return entityJson; + } catch (Exception e) { + throw new AAIException("AAI_7350", e); + } + } + + /** + * Store dynamic event. + * + * @param notificationJaxbContext + * the notification jaxb context + * @param notificationVersion + * the notification version + * @param eventHeader + * the event header + * @param obj + * the obj + * @throws AAIException + * the AAI exception + */ + public void storeDynamicEvent(DynamicJAXBContext notificationJaxbContext, String notificationVersion, + DynamicEntity eventHeader, DynamicEntity obj) throws AAIException { + + if (obj == null) { + throw new AAIException("AAI_7350"); + } + + DynamicEntity notificationEvent = notificationJaxbContext + .getDynamicType("inventory.aai.onap.org." + notificationVersion + ".NotificationEvent") + .newDynamicEntity(); + + if (eventHeader.get("id") == null) { + eventHeader.set("id", genDate2() + "-" + UUID.randomUUID().toString()); + } + + if (eventHeader.get("timestamp") == null) { + eventHeader.set("timestamp", genDate()); + } + + if (eventHeader.get("entityLink") == null) { + eventHeader.set("entityLink", "UNK"); + } + + if (eventHeader.get("action") == null) { + eventHeader.set("action", "UNK"); + } + + if (eventHeader.get("eventType") == null) { + eventHeader.set("eventType", AAIConfig.get("aai.notificationEvent.default.eventType", "UNK")); + } + + if (eventHeader.get("domain") == null) { + eventHeader.set("domain", AAIConfig.get("aai.notificationEvent.default.domain", "UNK")); + } + + if (eventHeader.get("sourceName") == null) { + eventHeader.set("sourceName", AAIConfig.get("aai.notificationEvent.default.sourceName", "UNK")); + } + + if (eventHeader.get("sequenceNumber") == null) { + eventHeader.set("sequenceNumber", AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK")); + } + + if (eventHeader.get("severity") == null) { + eventHeader.set("severity", AAIConfig.get("aai.notificationEvent.default.severity", "UNK")); + } + + if (eventHeader.get("version") == null) { + eventHeader.set("version", AAIConfig.get("aai.notificationEvent.default.version", "UNK")); + } + + if (notificationEvent.get("cambriaPartition") == null) { + notificationEvent.set("cambriaPartition", AAIConstants.UEB_PUB_PARTITION_AAI); + } + + notificationEvent.set("eventHeader", eventHeader); + notificationEvent.set("entity", obj); + + try { + StringWriter result = new StringWriter(); + + Marshaller marshaller = notificationJaxbContext.createMarshaller(); + marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.MEDIA_TYPE, "application/json"); + marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_INCLUDE_ROOT, false); + marshaller.setProperty(org.eclipse.persistence.jaxb.MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, false); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false); + marshaller.marshal(notificationEvent, result); + this.sendToDmaapJmsQueue(result.toString()); + + } catch (Exception e) { + throw new AAIException("AAI_7350", e); + } + } + + public String storeEvent(Loader loader, Introspector eventHeader, Introspector obj) throws AAIException { + if (obj == null) { + throw new AAIException("AAI_7350"); + } + + try { + final Introspector notificationEvent = loader.introspectorFromName("notification-event"); + + if (eventHeader.getValue("id") == null) { + eventHeader.setValue("id", genDate2() + "-" + UUID.randomUUID().toString()); + } + + if (eventHeader.getValue("timestamp") == null) { + eventHeader.setValue("timestamp", genDate()); + } + + if (eventHeader.getValue("entity-link") == null) { + eventHeader.setValue("entity-link", "UNK"); + } + + if (eventHeader.getValue("action") == null) { + eventHeader.setValue("action", "UNK"); + } + + if (eventHeader.getValue("event-type") == null) { + eventHeader.setValue("event-type", AAIConfig.get("aai.notificationEvent.default.eventType", "UNK")); + } + + if (eventHeader.getValue("domain") == null) { + eventHeader.setValue("domain", AAIConfig.get("aai.notificationEvent.default.domain", "UNK")); + } + + if (eventHeader.getValue("source-name") == null) { + eventHeader.setValue("source-name", AAIConfig.get("aai.notificationEvent.default.sourceName", "UNK")); + } + + if (eventHeader.getValue("sequence-number") == null) { + eventHeader.setValue("sequence-number", + AAIConfig.get("aai.notificationEvent.default.sequenceNumber", "UNK")); + } + + if (eventHeader.getValue("severity") == null) { + eventHeader.setValue("severity", AAIConfig.get("aai.notificationEvent.default.severity", "UNK")); + } + + if (eventHeader.getValue("version") == null) { + eventHeader.setValue("version", AAIConfig.get("aai.notificationEvent.default.version", "UNK")); + } + + if (notificationEvent.getValue("cambria-partition") == null) { + notificationEvent.setValue("cambria-partition", + AAIConfig.get("aai.notificationEvent.default.partition", AAIConstants.UEB_PUB_PARTITION_AAI)); + } + + notificationEvent.setValue("event-header", eventHeader.getUnderlyingObject()); + notificationEvent.setValue("entity", obj.getUnderlyingObject()); + + String entityJson = notificationEvent.marshal(false); + sendToDmaapJmsQueue(entityJson); + return entityJson; + } catch (JSONException e) { + throw new AAIException("AAI_7350", e); + } catch (AAIUnknownObjectException e) { + throw new AAIException("AAI_7350", e); + } + } + + private void sendToDmaapJmsQueue(String entityString) throws JSONException { + + JSONObject entityJsonObject = new JSONObject(entityString); + + JSONObject entityJsonObjectUpdated = new JSONObject(); + JSONObject finalJson = new JSONObject(); + + JSONObject entityHeader = entityJsonObject.getJSONObject("event-header"); + String cambriaPartition = entityJsonObject.getString("cambria.partition"); + + entityJsonObject.remove("event-header"); + entityJsonObject.remove("cambria.partition"); + + entityJsonObjectUpdated.put("event-header", entityHeader); + entityJsonObjectUpdated.put("cambria.partition", cambriaPartition); + + String transId = entityHeader.getString("id"); + String fromAppId = entityHeader.getString("source-name"); + + Iterator iter = entityJsonObject.keys(); + JSONObject entity = new JSONObject(); + if (iter.hasNext()) { + entity = entityJsonObject.getJSONObject(iter.next()); + } + + entityJsonObjectUpdated.put("entity", entity); + + finalJson.put("event-topic", "AAI-EVENT"); + finalJson.put("transId", transId); + finalJson.put("fromAppId", fromAppId); + finalJson.put("fullId", ""); + finalJson.put("aaiEventPayload", entityJsonObjectUpdated); + + messageProducer.sendMessageToDefaultDestination(finalJson); + } + + /** + * Gen date. + * + * @return the string + */ + public static String genDate() { + FormatDate fd = new FormatDate("YYYYMMdd-HH:mm:ss:SSS"); + return fd.getDateTime(); + } + + /** + * Gen date 2. + * + * @return the string + */ + public static String genDate2() { + FormatDate fd = new FormatDate("YYYYMMddHHmmss"); + return fd.getDateTime(); + } } diff --git a/aai-core/src/main/java/org/onap/aai/web/DmaapConfig.java b/aai-core/src/main/java/org/onap/aai/web/DmaapConfig.java index 657656c4..078ca963 100644 --- a/aai-core/src/main/java/org/onap/aai/web/DmaapConfig.java +++ b/aai-core/src/main/java/org/onap/aai/web/DmaapConfig.java @@ -17,8 +17,11 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.web; +import javax.annotation.PostConstruct; + import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.command.ActiveMQQueue; @@ -35,8 +38,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.jms.connection.CachingConnectionFactory; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.listener.DefaultMessageListenerContainer; - -import javax.annotation.PostConstruct; import org.springframework.web.client.RestTemplate; @Profile("dmaap") @@ -58,7 +59,7 @@ public class DmaapConfig { private String bindAddress; @PostConstruct - public void init(){ + public void init() { System.setProperty("activemq.tcp.url", bindAddress); } @@ -76,22 +77,22 @@ public class DmaapConfig { } @Bean(name = "connectionFactory") - public ActiveMQConnectionFactory activeMQConnectionFactory(){ + public ActiveMQConnectionFactory activeMQConnectionFactory() { return new ActiveMQConnectionFactory(bindAddress); } @Bean - public CachingConnectionFactory cachingConnectionFactory(){ + public CachingConnectionFactory cachingConnectionFactory() { return new CachingConnectionFactory(activeMQConnectionFactory()); } @Bean(name = "destinationQueue") - public ActiveMQQueue activeMQQueue(){ + public ActiveMQQueue activeMQQueue() { return new ActiveMQQueue("IN_QUEUE"); } @Bean - public JmsTemplate jmsTemplate(){ + public JmsTemplate jmsTemplate() { JmsTemplate jmsTemplate = new JmsTemplate(); jmsTemplate.setConnectionFactory(activeMQConnectionFactory()); @@ -101,11 +102,11 @@ public class DmaapConfig { } @Bean - public AAIDmaapEventJMSProducer jmsProducer(){ + public AAIDmaapEventJMSProducer jmsProducer() { return new AAIDmaapEventJMSProducer(); } - @Bean(name="jmsConsumer") + @Bean(name = "jmsConsumer") public AAIDmaapEventJMSConsumer jmsConsumer() throws Exception { return new AAIDmaapEventJMSConsumer(ctx.getEnvironment(), dmaapRestTemplate, dmaapHeaders); } diff --git a/aai-core/src/main/java/org/onap/aai/web/EventClientPublisher.java b/aai-core/src/main/java/org/onap/aai/web/EventClientPublisher.java index 94d8f4cd..d552f231 100644 --- a/aai-core/src/main/java/org/onap/aai/web/EventClientPublisher.java +++ b/aai-core/src/main/java/org/onap/aai/web/EventClientPublisher.java @@ -17,10 +17,15 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.web; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; + +import java.io.UnsupportedEncodingException; +import java.util.Base64; + import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,9 +34,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.client.RestTemplate; -import java.io.UnsupportedEncodingException; -import java.util.Base64; - @Configuration public class EventClientPublisher { @@ -67,21 +69,20 @@ public class EventClientPublisher { @Value("${dmaap.ribbon.contentType:application/json}") private String contentType; - @Bean(name="dmaapRestTemplate") - public RestTemplate dmaapRestTemplate(){ + @Bean(name = "dmaapRestTemplate") + public RestTemplate dmaapRestTemplate() { return new RestTemplate(); } - @Bean(name="dmaapHeaders") - public HttpHeaders dmaapHeaders() throws UnsupportedEncodingException - { + @Bean(name = "dmaapHeaders") + public HttpHeaders dmaapHeaders() throws UnsupportedEncodingException { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); - if(username != null && password != null){ + if (username != null && password != null) { - if(!StringUtils.EMPTY.equals(username) && !StringUtils.EMPTY.equals(password)){ + if (!StringUtils.EMPTY.equals(username) && !StringUtils.EMPTY.equals(password)) { byte[] userPass = (username + ":" + password).getBytes("UTF-8"); diff --git a/aai-core/src/main/java/org/onap/aai/workarounds/NamingExceptions.java b/aai-core/src/main/java/org/onap/aai/workarounds/NamingExceptions.java index 435fa4dc..c140c48c 100644 --- a/aai-core/src/main/java/org/onap/aai/workarounds/NamingExceptions.java +++ b/aai-core/src/main/java/org/onap/aai/workarounds/NamingExceptions.java @@ -17,62 +17,63 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.workarounds; public class NamingExceptions { - /** - * Instantiates a new naming exceptions. - */ - private NamingExceptions() { - - } - - private static class Helper { - private static final NamingExceptions INSTANCE = new NamingExceptions(); - } - - /** - * Gets the single instance of NamingExceptions. - * - * @return single instance of NamingExceptions - */ - public static NamingExceptions getInstance() { - return Helper.INSTANCE; - } - - /** - * Gets the object name. - * - * @param name the name - * @return the object name - */ - public String getObjectName(String name) { - - String result = name; - - if (name.equals("cvlan-tag")) { - result = "cvlan-tag-entry"; - } - - return result; - } - - /** - * Gets the DB name. - * - * @param name the name - * @return the DB name - */ - public String getDBName(String name) { - - String result = name; - - if (name.equals("cvlan-tag-entry")) { - result = "cvlan-tag"; - } - - return result; - - } + /** + * Instantiates a new naming exceptions. + */ + private NamingExceptions() { + + } + + private static class Helper { + private static final NamingExceptions INSTANCE = new NamingExceptions(); + } + + /** + * Gets the single instance of NamingExceptions. + * + * @return single instance of NamingExceptions + */ + public static NamingExceptions getInstance() { + return Helper.INSTANCE; + } + + /** + * Gets the object name. + * + * @param name the name + * @return the object name + */ + public String getObjectName(String name) { + + String result = name; + + if (name.equals("cvlan-tag")) { + result = "cvlan-tag-entry"; + } + + return result; + } + + /** + * Gets the DB name. + * + * @param name the name + * @return the DB name + */ + public String getDBName(String name) { + + String result = name; + + if (name.equals("cvlan-tag-entry")) { + result = "cvlan-tag"; + } + + return result; + + } } -- cgit 1.2.3-korg