diff options
Diffstat (limited to 'aai-core/src/main/java')
229 files changed, 19972 insertions, 19540 deletions
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<String> endpoints = new ArrayList<>(); - private Map<String, String> endpointToLogicalName = new HashMap<String, String>(); - - /** - * 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<String> 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<String> 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<String> properties = obj.getProperties(); - Set<String> 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<String> 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<String> 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<String, String> getLogicalNames() { - - return endpointToLogicalName; - - } - - /** - * Gets the endpoints. - * - * @return the endpoints - */ - public List<String> getEndpoints() { - - return this.getEndpoints(""); - - } - - /** - * Gets the endpoints. - * - * @param filterOut the filter out - * @return the endpoints - */ - public List<String> getEndpoints(String filterOut) { - List<String> 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<String> endpoints = new ArrayList<>(); + private Map<String, String> endpointToLogicalName = new HashMap<String, String>(); + + /** + * 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<String> 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<String> 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<String> properties = obj.getProperties(); + Set<String> 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<String> 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<String> 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<String, String> getLogicalNames() { + + return endpointToLogicalName; + + } + + /** + * Gets the endpoints. + * + * @return the endpoints + */ + public List<String> getEndpoints() { + + return this.getEndpoints(""); + + } + + /** + * Gets the endpoints. + * + * @param filterOut the filter out + * @return the endpoints + */ + public List<String> getEndpoints(String filterOut) { + List<String> 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<String> validFunctions = new HashSet<>(); - private Map<String, AAIUser> 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<String, AAIUser> 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<String, Boolean> usrs = this.getUsernamesFromRole(roleObject); - List<String> 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<String> 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<String> getRoleHttpMethods(String aaiFunctionName, JsonObject roleObject) { - List<String> 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<String> getAAIFunctions(JsonObject roleObject) { - List<String> 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<String, Boolean> getUsernamesFromRole(JsonObject roleObject) throws UnsupportedEncodingException { - Map<String, Boolean> 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<String> validFunctions = new HashSet<>(); + private Map<String, AAIUser> 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<String, AAIUser> 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<String, Boolean> usrs = this.getUsernamesFromRole(roleObject); + List<String> 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<String> 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<String> getRoleHttpMethods(String aaiFunctionName, JsonObject roleObject) { + List<String> 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<String> getAAIFunctions(JsonObject roleObject) { + List<String> 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<String, Boolean> getUsernamesFromRole(JsonObject roleObject) throws UnsupportedEncodingException { + Map<String, Boolean> 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<AAIUser> 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<String> 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<AAIUser> getUser(String username, boolean wildcardCheck) { - if (users.containsKey(username)) { - return Optional.of(users.get(username)); - } else if (wildcardCheck){ - List<AAIUser> 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<AAIUser> 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<String> 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<AAIUser> getUser(String username, boolean wildcardCheck) { + if (users.containsKey(username)) { + return Optional.of(users.get(username)); + } else if (wildcardCheck) { + List<AAIUser> 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<T> implements Callable<T> { - private Map<String,String> mdcCopy; - /** - * The constructor. - */ - @SuppressWarnings("unchecked") - public AaiCallable() { + private Map<String, String> 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<SchemaVersion, MoxyLoader> moxyInstanceMap = new ConcurrentHashMap<>(); - + @Autowired NodesConfiguration nodesConfiguration; @@ -50,7 +52,7 @@ public class IntrospectionConfig { @Bean public Map<SchemaVersion, MoxyLoader> 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> T getBean(String beanName, Class<T> requiredType) { - if(context != null){ - return context.getBean(beanName, requiredType); - } + + public static <T> T getBean(String beanName, Class<T> requiredType) { + if (context != null) { + return context.getBean(beanName, requiredType); + } return null; - } + } - public static <T> T getBean(Class<T> clazz){ - if(context != null){ + public static <T> T getBean(Class<T> 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<Vertex> searchVertexByIdentityMap(String type, Map<String, Object> 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<Vertex> results = queryParser.getQueryBuilder().toList(); - - return reduceToSingleVertex(results, map); - } - - /** - * @param type - * @param map - form [{propname}:{value}] - * @return - * @throws AAIException - */ - public Optional<Vertex> locateUniqueVertex(String type, Map<String, Object> map) throws AAIException { - - return reduceToSingleVertex(locateUniqueVertices(type, map), map); - } - - public List<Vertex> locateUniqueVertices(String type, Map<String, Object> 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<String, Object> map) throws AAIUnknownObjectException { - final Introspector relationship = loader.introspectorFromName("relationship"); - relationship.setValue("related-to", type); - final List<Object> data = relationship.getValue("relationship-data"); - for (Entry<String, Object> 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<String, Object> propHash) throws AAIUnknownObjectException { - final Introspector result = loader.introspectorFromName(targetNodeType); - for (Entry<String, Object> entry : propHash.entrySet()) { - result.setValue(entry.getKey(), entry.getValue()); - } - return result; - } - - private Optional<Vertex> reduceToSingleVertex(List<Vertex> vertices, Map<String, Object> 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<String> getVertexProperties(Vertex v) { - List<String> retArr = new ArrayList<>(); - if( v == null ){ - retArr.add("null Node object passed to showPropertiesForNode()\n"); - } - else { - String nodeType; - Object ob = v.<Object>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<VertexProperty<Object>> pI = v.properties(); - while( pI.hasNext() ){ - VertexProperty<Object> 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<Vertex> searchVertexByIdentityMap(String type, Map<String, Object> 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<Vertex> results = queryParser.getQueryBuilder().toList(); + + return reduceToSingleVertex(results, map); + } + + /** + * @param type + * @param map - form [{propname}:{value}] + * @return + * @throws AAIException + */ + public Optional<Vertex> locateUniqueVertex(String type, Map<String, Object> map) throws AAIException { + + return reduceToSingleVertex(locateUniqueVertices(type, map), map); + } + + public List<Vertex> locateUniqueVertices(String type, Map<String, Object> 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<String, Object> map) throws AAIUnknownObjectException { + final Introspector relationship = loader.introspectorFromName("relationship"); + relationship.setValue("related-to", type); + final List<Object> data = relationship.getValue("relationship-data"); + for (Entry<String, Object> 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<String, Object> propHash) + throws AAIUnknownObjectException { + final Introspector result = loader.introspectorFromName(targetNodeType); + for (Entry<String, Object> entry : propHash.entrySet()) { + result.setValue(entry.getKey(), entry.getValue()); + } + return result; + } + + private Optional<Vertex> reduceToSingleVertex(List<Vertex> vertices, Map<String, Object> 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<String> getVertexProperties(Vertex v) { + List<String> retArr = new ArrayList<>(); + if (v == null) { + retArr.add("null Node object passed to showPropertiesForNode()\n"); + } else { + String nodeType; + Object ob = v.<Object>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<VertexProperty<Object>> pI = v.properties(); + while (pI.hasNext()) { + VertexProperty<Object> 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<GraphSONPartialReader.Builder, GraphSONWriter.Builder, GraphSONMapper.Builder> { +public final class GraphSONPartialIO + implements Io<GraphSONPartialReader.Builder, GraphSONWriter.Builder, GraphSONMapper.Builder> { private final IoRegistry registry; private final Graph graph; private final Optional<Consumer<Mapper.Builder>> onMapper; @@ -76,8 +79,8 @@ public final class GraphSONPartialIO implements Io<GraphSONPartialReader.Builder */ @Override public GraphSONMapper.Builder mapper() { - final GraphSONMapper.Builder builder = (null == this.registry) ? - GraphSONMapper.build().version(version) : GraphSONMapper.build().version(version).addRegistry(this.registry); + final GraphSONMapper.Builder builder = (null == this.registry) ? GraphSONMapper.build().version(version) + : GraphSONMapper.build().version(version).addRegistry(this.registry); onMapper.ifPresent(c -> c.accept(builder)); return builder; } @@ -151,7 +154,8 @@ public final class GraphSONPartialIO implements Io<GraphSONPartialReader.Builder @Override public GraphSONPartialIO create() { - if (null == graph) throw new IllegalArgumentException("The graph argument was not specified"); + if (null == graph) + throw new IllegalArgumentException("The graph argument was not specified"); return new GraphSONPartialIO(this); } } diff --git a/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialReader.java b/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialReader.java index 2088286d..fdc8e814 100644 --- a/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialReader.java +++ b/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialReader.java @@ -17,8 +17,25 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbgen; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; +import java.util.stream.Stream; + import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; @@ -45,22 +62,6 @@ import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper; import org.apache.tinkerpop.shaded.jackson.databind.node.JsonNodeType; import org.onap.aai.dbmap.InMemoryGraph; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Function; -import java.util.stream.Stream; - /** * This is a Wrapper around the GraphsonReader class * The idea is to rewrite methods that are customized for A&AI @@ -70,22 +71,21 @@ import java.util.stream.Stream; * */ public final class GraphSONPartialReader implements GraphReader { - private final ObjectMapper mapper ; - private final long batchSize ; - private final GraphSONVersion version ; + private final ObjectMapper mapper; + private final long batchSize; + private final GraphSONVersion version; private boolean unwrapAdjacencyList = false; private final GraphSONReader reader; - + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(InMemoryGraph.class); - final TypeReference<Map<String, Object>> mapTypeReference = new TypeReference<Map<String, Object>>() { - }; + final TypeReference<Map<String, Object>> mapTypeReference = new TypeReference<Map<String, Object>>() {}; 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<StarGraph.StarVertex,Vertex> cache = new HashMap<>(); + LOGGER.info("Read the Partial Graph"); + final Map<StarGraph.StarVertex, Vertex> 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).<Vertex>map(FunctionUtils.wrapFunction(line -> readVertex(new ByteArrayInputStream(line.getBytes()), null, null, Direction.IN))).forEach(vertex -> { - try{ - final Attachable<Vertex> attachable = (Attachable<Vertex>) 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) + .<Vertex>map(FunctionUtils.wrapFunction( + line -> readVertex(new ByteArrayInputStream(line.getBytes()), null, null, Direction.IN))) + .forEach(vertex -> { + try { + final Attachable<Vertex> attachable = (Attachable<Vertex>) 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<Vertex> readVertices(final InputStream inputStream, - final Function<Attachable<Vertex>, Vertex> vertexAttachMethod, - final Function<Attachable<Edge>, Edge> edgeAttachMethod, - final Direction attachEdgesOfThisDirection) throws IOException { - // return readVertexStrings(inputStream).<Vertex>map(FunctionUtils.wrapFunction(line -> readVertex(new ByteArrayInputStream(line.getBytes()), vertexAttachMethod, edgeAttachMethod, attachEdgesOfThisDirection))).iterator(); + final Function<Attachable<Vertex>, Vertex> vertexAttachMethod, + final Function<Attachable<Edge>, Edge> edgeAttachMethod, final Direction attachEdgesOfThisDirection) + throws IOException { + // return readVertexStrings(inputStream).<Vertex>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<Attachable<Vertex>, Vertex> vertexAttachMethod) throws IOException { + public Vertex readVertex(final InputStream inputStream, + final Function<Attachable<Vertex>, 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<Attachable<Vertex>, Vertex> vertexAttachMethod, - final Function<Attachable<Edge>, Edge> edgeAttachMethod, - final Direction attachEdgesOfThisDirection) throws IOException { - - return reader.readVertex(inputStream, vertexAttachMethod, edgeAttachMethod, attachEdgesOfThisDirection); + final Function<Attachable<Vertex>, Vertex> vertexAttachMethod, + final Function<Attachable<Edge>, 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<Attachable<Edge>, Edge> edgeAttachMethod) throws IOException { - /*if (version == GraphSONVersion.v1_0) { - final Map<String, Object> edgeData = mapper.readValue(inputStream, mapTypeReference); - - final Map<String, Object> edgeProperties = edgeData.containsKey(GraphSONTokens.PROPERTIES) ? - (Map<String, Object>) 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<Attachable<Edge>, Edge> edgeAttachMethod) + throws IOException { + /* + * if (version == GraphSONVersion.v1_0) { + * final Map<String, Object> edgeData = mapper.readValue(inputStream, mapTypeReference); + * + * final Map<String, Object> edgeProperties = edgeData.containsKey(GraphSONTokens.PROPERTIES) ? + * (Map<String, Object>) 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<Attachable<VertexProperty>, VertexProperty> vertexPropertyAttachMethod) throws IOException { - /*if (version == GraphSONVersion.v1_0) { - final Map<String, Object> vpData = mapper.readValue(inputStream, mapTypeReference); - final Map<String, Object> metaProperties = (Map<String, Object>) 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<Attachable<VertexProperty>, VertexProperty> vertexPropertyAttachMethod) throws IOException { + /* + * if (version == GraphSONVersion.v1_0) { + * final Map<String, Object> vpData = mapper.readValue(inputStream, mapTypeReference); + * final Map<String, Object> metaProperties = (Map<String, Object>) 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<Attachable<Property>, Property> propertyAttachMethod) throws IOException { - /*if (version == GraphSONVersion.v1_0) { - final Map<String, Object> 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<Attachable<Property>, Property> propertyAttachMethod) throws IOException { + /* + * if (version == GraphSONVersion.v1_0) { + * final Map<String, Object> 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<String> 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<ObjectMapper> 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<ObjectMapper> 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. * <p/> * 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<String, EdgeRule> edges = null; - Set<String> 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<String, Introspector> objs = loader.getAllObjects(); - Map<String, PropertyKey> seenProps = new HashMap<>(); - - for (Introspector obj : objs.values()) { - for (String propName : obj.getProperties()) { - String dbPropName = propName; - Optional<String> 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<String, EdgeRule> edges = null; + Set<String> 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<String, Introspector> objs = loader.getAllObjects(); + Map<String, PropertyKey> seenProps = new HashMap<>(); + + for (Introspector obj : objs.values()) { + for (String propName : obj.getProperties()) { + String dbPropName = propName; + Optional<String> 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<String, String> PropertyDataTypeMap; - private Multimap<String, String> NodeMapIndexedProps; - private Multimap<String, String> NodeAltKey1Props; - private Multimap<String, String> NodeDependencies; - private Multimap<String, String> NodeKeyProps; - private Multimap<String, String> NodeReqProps; - private Multimap<String, String> NodeNameProps; - private Multimap<String, String> NodeUniqueProps; - - // if new dataTypes are added - make sure to update getAllFields() method below - private ArrayList<String> stringFields; - private ArrayList<String> stringListFields; - private ArrayList<String> longFields; - private ArrayList<String> intFields; - private ArrayList<String> shortFields; - private ArrayList<String> booleanFields; - - private ArrayList<String> requiredFields; - private ArrayList<String> orderedFields; - private AAIResource recurseToResource; - private boolean allowDirectWrite; - private boolean allowDirectRead; - private ArrayList<String> 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<String, String> getPropertyDataTypeMap() { - return PropertyDataTypeMap; - } - - /** - * Sets the property data type map. - * - * @param propertyDataTypeMap the property data type map - */ - public void setPropertyDataTypeMap(Map<String, String> propertyDataTypeMap) { - PropertyDataTypeMap = propertyDataTypeMap; - } - - /** - * Gets the node map indexed props. - * - * @return the node map indexed props - */ - public Multimap<String, String> getNodeMapIndexedProps() { - return NodeMapIndexedProps; - } - - /** - * Sets the node map indexed props. - * - * @param nodeMapIndexedProps the node map indexed props - */ - public void setNodeMapIndexedProps(Multimap<String, String> nodeMapIndexedProps) { - NodeMapIndexedProps = nodeMapIndexedProps; - } - - /** - * Gets the node key props. - * - * @return the node key props - */ - public Multimap<String, String> getNodeKeyProps() { - return NodeKeyProps; - } - - /** - * Sets the node key props. - * - * @param nodeKeyProps the node key props - */ - public void setNodeKeyProps(Multimap<String, String> nodeKeyProps) { - this.NodeKeyProps = nodeKeyProps; - } - - /** - * Gets the node name props. - * - * @return the node name props - */ - public Multimap<String, String> getNodeNameProps() { - return NodeNameProps; - } - - /** - * Sets the node name props. - * - * @param nodeNameProps the node name props - */ - public void setNodeNameProps(Multimap<String, String> nodeNameProps) { - - NodeNameProps = nodeNameProps; - } - - /** - * Gets the node unique props. - * - * @return the node unique props - */ - public Multimap<String, String> getNodeUniqueProps() { - return NodeUniqueProps; - } - - /** - * Sets the node unique props. - * - * @param nodeUniqueProps the node unique props - */ - public void setNodeUniqueProps(Multimap<String, String> nodeUniqueProps) { - NodeUniqueProps = nodeUniqueProps; - } - - /** - * Gets the node req props. - * - * @return the node req props - */ - public Multimap<String, String> getNodeReqProps() { - return NodeReqProps; - } - - /** - * Sets the node req props. - * - * @param nodeReqProps the node req props - */ - public void setNodeReqProps(Multimap<String, String> 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<String> getStringFields() { - if (this.stringFields == null) { - this.stringFields = new ArrayList<String>(); - } - return this.stringFields; - } - - /** - * Sets the string fields. - * - * @param stringFields the new string fields - */ - public void setStringFields(ArrayList<String> stringFields) { - this.stringFields = stringFields; - } - - /** - * Gets the string list fields. - * - * @return the string list fields - */ - public ArrayList<String> getStringListFields() { - if (this.stringListFields == null) { - this.stringListFields = new ArrayList<String>(); - } - return this.stringListFields; - } - - /** - * Sets the string list fields. - * - * @param stringListFields the new string list fields - */ - public void setStringListFields(ArrayList<String> stringListFields) { - this.stringListFields = stringListFields; - } - - /** - * Gets the long fields. - * - * @return the long fields - */ - public ArrayList<String> getLongFields() { - if (this.longFields == null) { - this.longFields = new ArrayList<String>(); - } - return longFields; - } - - /** - * Sets the long fields. - * - * @param longFields the new long fields - */ - public void setLongFields(ArrayList<String> longFields) { - this.longFields = longFields; - } - - /** - * Gets the int fields. - * - * @return the int fields - */ - public ArrayList<String> getIntFields() { - if (this.intFields == null) { - this.intFields = new ArrayList<String>(); - } - return intFields; - } - - /** - * Sets the int fields. - * - * @param intFields the new int fields - */ - public void setIntFields(ArrayList<String> intFields) { - this.intFields = intFields; - } - - /** - * Gets the short fields. - * - * @return the short fields - */ - public ArrayList<String> getShortFields() { - if (this.shortFields == null) { - this.shortFields = new ArrayList<String>(); - } - return shortFields; - } - - /** - * Sets the short fields. - * - * @param shortFields the new short fields - */ - public void setShortFields(ArrayList<String> shortFields) { - this.shortFields = shortFields; - } - - /** - * Gets the boolean fields. - * - * @return the boolean fields - */ - public ArrayList<String> getBooleanFields() { - if (this.booleanFields == null) { - this.booleanFields = new ArrayList<String>(); - } - return booleanFields; - } - - /** - * Sets the boolean fields. - * - * @param booleanFields the new boolean fields - */ - public void setBooleanFields(ArrayList<String> booleanFields) { - this.booleanFields = booleanFields; - } - - /** - * Gets the required fields. - * - * @return the required fields - */ - public ArrayList<String> getRequiredFields() { - if (this.requiredFields == null) { - this.requiredFields = new ArrayList<String>(); - } - return requiredFields; - } - - /** - * Sets the required fields. - * - * @param requiredFields the new required fields - */ - public void setRequiredFields(ArrayList<String> requiredFields) { - this.requiredFields = requiredFields; - } - - /** - * Gets the ordered fields. - * - * @return the ordered fields - */ - public ArrayList<String> getOrderedFields() { - if (this.orderedFields == null) { - this.orderedFields = new ArrayList<String>(); - } - return this.orderedFields; - } - - /** - * Gets the all fields. - * - * @return the all fields - */ - public ArrayList<String> getAllFields() { - - ArrayList<String> allFields = new ArrayList<String>(); - 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<String, String> _dbRulesNodeAltKey1Props) { - this.NodeAltKey1Props = _dbRulesNodeAltKey1Props; - } - - /** - * Gets the node alt key 1 props. - * - * @return the node alt key 1 props - */ - public Multimap<String,String> getNodeAltKey1Props() { - return this.NodeAltKey1Props; - } - - /** - * Sets the node dependencies. - * - * @param _dbRulesNodeDependencies the db rules node dependencies - */ - public void setNodeDependencies(Multimap<String, String> _dbRulesNodeDependencies) { - this.NodeDependencies = _dbRulesNodeDependencies; - } - - /** - * Gets the node dependencies. - * - * @return the node dependencies - */ - public Multimap<String,String> 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<String> getAutoGenUuidFields() { - if (this.autoGenUuidFields == null) { - this.autoGenUuidFields = new ArrayList<String>(); - } - 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<String, String> PropertyDataTypeMap; + private Multimap<String, String> NodeMapIndexedProps; + private Multimap<String, String> NodeAltKey1Props; + private Multimap<String, String> NodeDependencies; + private Multimap<String, String> NodeKeyProps; + private Multimap<String, String> NodeReqProps; + private Multimap<String, String> NodeNameProps; + private Multimap<String, String> NodeUniqueProps; + + // if new dataTypes are added - make sure to update getAllFields() method below + private ArrayList<String> stringFields; + private ArrayList<String> stringListFields; + private ArrayList<String> longFields; + private ArrayList<String> intFields; + private ArrayList<String> shortFields; + private ArrayList<String> booleanFields; + + private ArrayList<String> requiredFields; + private ArrayList<String> orderedFields; + private AAIResource recurseToResource; + private boolean allowDirectWrite; + private boolean allowDirectRead; + private ArrayList<String> 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<String, String> getPropertyDataTypeMap() { + return PropertyDataTypeMap; + } + + /** + * Sets the property data type map. + * + * @param propertyDataTypeMap the property data type map + */ + public void setPropertyDataTypeMap(Map<String, String> propertyDataTypeMap) { + PropertyDataTypeMap = propertyDataTypeMap; + } + + /** + * Gets the node map indexed props. + * + * @return the node map indexed props + */ + public Multimap<String, String> getNodeMapIndexedProps() { + return NodeMapIndexedProps; + } + + /** + * Sets the node map indexed props. + * + * @param nodeMapIndexedProps the node map indexed props + */ + public void setNodeMapIndexedProps(Multimap<String, String> nodeMapIndexedProps) { + NodeMapIndexedProps = nodeMapIndexedProps; + } + + /** + * Gets the node key props. + * + * @return the node key props + */ + public Multimap<String, String> getNodeKeyProps() { + return NodeKeyProps; + } + + /** + * Sets the node key props. + * + * @param nodeKeyProps the node key props + */ + public void setNodeKeyProps(Multimap<String, String> nodeKeyProps) { + this.NodeKeyProps = nodeKeyProps; + } + + /** + * Gets the node name props. + * + * @return the node name props + */ + public Multimap<String, String> getNodeNameProps() { + return NodeNameProps; + } + + /** + * Sets the node name props. + * + * @param nodeNameProps the node name props + */ + public void setNodeNameProps(Multimap<String, String> nodeNameProps) { + + NodeNameProps = nodeNameProps; + } + + /** + * Gets the node unique props. + * + * @return the node unique props + */ + public Multimap<String, String> getNodeUniqueProps() { + return NodeUniqueProps; + } + + /** + * Sets the node unique props. + * + * @param nodeUniqueProps the node unique props + */ + public void setNodeUniqueProps(Multimap<String, String> nodeUniqueProps) { + NodeUniqueProps = nodeUniqueProps; + } + + /** + * Gets the node req props. + * + * @return the node req props + */ + public Multimap<String, String> getNodeReqProps() { + return NodeReqProps; + } + + /** + * Sets the node req props. + * + * @param nodeReqProps the node req props + */ + public void setNodeReqProps(Multimap<String, String> 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<String> getStringFields() { + if (this.stringFields == null) { + this.stringFields = new ArrayList<String>(); + } + return this.stringFields; + } + + /** + * Sets the string fields. + * + * @param stringFields the new string fields + */ + public void setStringFields(ArrayList<String> stringFields) { + this.stringFields = stringFields; + } + + /** + * Gets the string list fields. + * + * @return the string list fields + */ + public ArrayList<String> getStringListFields() { + if (this.stringListFields == null) { + this.stringListFields = new ArrayList<String>(); + } + return this.stringListFields; + } + + /** + * Sets the string list fields. + * + * @param stringListFields the new string list fields + */ + public void setStringListFields(ArrayList<String> stringListFields) { + this.stringListFields = stringListFields; + } + + /** + * Gets the long fields. + * + * @return the long fields + */ + public ArrayList<String> getLongFields() { + if (this.longFields == null) { + this.longFields = new ArrayList<String>(); + } + return longFields; + } + + /** + * Sets the long fields. + * + * @param longFields the new long fields + */ + public void setLongFields(ArrayList<String> longFields) { + this.longFields = longFields; + } + + /** + * Gets the int fields. + * + * @return the int fields + */ + public ArrayList<String> getIntFields() { + if (this.intFields == null) { + this.intFields = new ArrayList<String>(); + } + return intFields; + } + + /** + * Sets the int fields. + * + * @param intFields the new int fields + */ + public void setIntFields(ArrayList<String> intFields) { + this.intFields = intFields; + } + + /** + * Gets the short fields. + * + * @return the short fields + */ + public ArrayList<String> getShortFields() { + if (this.shortFields == null) { + this.shortFields = new ArrayList<String>(); + } + return shortFields; + } + + /** + * Sets the short fields. + * + * @param shortFields the new short fields + */ + public void setShortFields(ArrayList<String> shortFields) { + this.shortFields = shortFields; + } + + /** + * Gets the boolean fields. + * + * @return the boolean fields + */ + public ArrayList<String> getBooleanFields() { + if (this.booleanFields == null) { + this.booleanFields = new ArrayList<String>(); + } + return booleanFields; + } + + /** + * Sets the boolean fields. + * + * @param booleanFields the new boolean fields + */ + public void setBooleanFields(ArrayList<String> booleanFields) { + this.booleanFields = booleanFields; + } + + /** + * Gets the required fields. + * + * @return the required fields + */ + public ArrayList<String> getRequiredFields() { + if (this.requiredFields == null) { + this.requiredFields = new ArrayList<String>(); + } + return requiredFields; + } + + /** + * Sets the required fields. + * + * @param requiredFields the new required fields + */ + public void setRequiredFields(ArrayList<String> requiredFields) { + this.requiredFields = requiredFields; + } + + /** + * Gets the ordered fields. + * + * @return the ordered fields + */ + public ArrayList<String> getOrderedFields() { + if (this.orderedFields == null) { + this.orderedFields = new ArrayList<String>(); + } + return this.orderedFields; + } + + /** + * Gets the all fields. + * + * @return the all fields + */ + public ArrayList<String> getAllFields() { + + ArrayList<String> allFields = new ArrayList<String>(); + 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<String, String> _dbRulesNodeAltKey1Props) { + this.NodeAltKey1Props = _dbRulesNodeAltKey1Props; + } + + /** + * Gets the node alt key 1 props. + * + * @return the node alt key 1 props + */ + public Multimap<String, String> getNodeAltKey1Props() { + return this.NodeAltKey1Props; + } + + /** + * Sets the node dependencies. + * + * @param _dbRulesNodeDependencies the db rules node dependencies + */ + public void setNodeDependencies(Multimap<String, String> _dbRulesNodeDependencies) { + this.NodeDependencies = _dbRulesNodeDependencies; + } + + /** + * Gets the node dependencies. + * + * @return the node dependencies + */ + public Multimap<String, String> 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<String> getAutoGenUuidFields() { + if (this.autoGenUuidFields == null) { + this.autoGenUuidFields = new ArrayList<String>(); + } + 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> aaiResourceKey; + private List<AAIResourceKey> aaiResourceKey; - /** - * Gets the aai resource key. - * - * @return the aai resource key - */ - public List<AAIResourceKey> getAaiResourceKey() { - if (aaiResourceKey == null) { - aaiResourceKey = new ArrayList<AAIResourceKey>(); - } - return aaiResourceKey; - } + /** + * Gets the aai resource key. + * + * @return the aai resource key + */ + public List<AAIResourceKey> getAaiResourceKey() { + if (aaiResourceKey == null) { + aaiResourceKey = new ArrayList<AAIResourceKey>(); + } + 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<String, AAIResource> aaiResources; - private HashMap<String, AAIResource> resourceLookup; - - - /** - * Gets the aai resources. - * - * @return the aai resources - */ - public HashMap<String, AAIResource> getAaiResources() { - if (aaiResources == null) { - aaiResources = new HashMap<String, AAIResource>(); - } - return aaiResources; - } - /** - * Gets the jaxb context. - * - * @return the jaxb context - */ - public DynamicJAXBContext getJaxbContext() { - return jaxbContext; - } + private DynamicJAXBContext jaxbContext; + + private HashMap<String, AAIResource> aaiResources; + private HashMap<String, AAIResource> resourceLookup; + + /** + * Gets the aai resources. + * + * @return the aai resources + */ + public HashMap<String, AAIResource> getAaiResources() { + if (aaiResources == null) { + aaiResources = new HashMap<String, AAIResource>(); + } + 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<String, AAIResource> getResourceLookup() { + if (resourceLookup == null) { + resourceLookup = new HashMap<String, AAIResource>(); + } + return resourceLookup; + } - /** - * Gets the resource lookup. - * - * @return the resource lookup - */ - public HashMap<String, AAIResource> getResourceLookup() { - if (resourceLookup == null) { - resourceLookup = new HashMap<String, AAIResource>(); - } - return resourceLookup; - } + /** + * Sets the resource lookup. + * + * @param resourceLookup the resource lookup + */ + public void setResourceLookup(HashMap<String, AAIResource> resourceLookup) { + this.resourceLookup = resourceLookup; + } - /** - * Sets the resource lookup. - * - * @param resourceLookup the resource lookup - */ - public void setResourceLookup(HashMap<String, AAIResource> 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; /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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. - * <p>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. + * <p> + * 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; /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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> aaiResponseMessage; - @XmlAnyElement(lax = true) - protected List<Object> any; + @XmlElement(name = "aai-response-message") + protected List<AAIResponseMessage> aaiResponseMessage; + @XmlAnyElement(lax = true) + protected List<Object> any; - /** - * Gets the AAI response message. - * - * @return the AAI response message - */ - public List<AAIResponseMessage> getAAIResponseMessage() { - if (aaiResponseMessage == null) { - aaiResponseMessage = new ArrayList<AAIResponseMessage>(); - } - return this.aaiResponseMessage; - } + /** + * Gets the AAI response message. + * + * @return the AAI response message + */ + public List<AAIResponseMessage> getAAIResponseMessage() { + if (aaiResponseMessage == null) { + aaiResponseMessage = new ArrayList<AAIResponseMessage>(); + } + return this.aaiResponseMessage; + } - /** - * Gets the any. - * - * @return the any - */ - public List<Object> getAny() { - if (any == null) { - any = new ArrayList<Object>(); - } - return this.any; - } + /** + * Gets the any. + * + * @return the any + */ + public List<Object> getAny() { + if (any == null) { + any = new ArrayList<Object>(); + } + 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 <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> -// 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 <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> +// 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; - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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<String> variable; @@ -354,8 +348,9 @@ public class Fault { * * <p> * For example, to add a new item, do as follows: + * * <pre> - * getVariable().add(newItem); + * getVariable().add(newItem); * </pre> * * 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. - * <p>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. + * <p> + * 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<String> 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<String> 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; - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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> responseMessage; @@ -181,8 +179,9 @@ public class Info { * * <p> * For example, to add a new item, do as follows: + * * <pre> - * getResponseMessage().add(newItem); + * getResponseMessage().add(newItem); * </pre> * * @@ -199,11 +198,12 @@ public class Info { return this.responseMessage; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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<String> variable; @@ -357,8 +352,9 @@ public class Info { * * <p> * For example, to add a new item, do as follows: + * * <pre> - * getVariable().add(newItem); + * getVariable().add(newItem); * </pre> * * 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. - * <p>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. + * <p> + * 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; - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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; } - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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<String> variable; @@ -354,8 +348,9 @@ public class Fault { * * <p> * For example, to add a new item, do as follows: + * * <pre> - * getVariable().add(newItem); + * getVariable().add(newItem); * </pre> * * 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. - * <p>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. + * <p> + * 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<String> 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<String> 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; - /** - * <p>Java class for anonymous complex type. + * <p> + * Java class for anonymous complex type. * - * <p>The following schema fragment specifies the expected content contained within this class. + * <p> + * The following schema fragment specifies the expected content contained within this class. * * <pre> * <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<TransactionLogEntry> 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<String> (); + this.templateVars = new LinkedList<String>(); 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<String> (); + this.templateVars = new LinkedList<String>(); 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<String> (); + this.templateVars = new LinkedList<String>(); 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<String> (); + this.templateVars = new LinkedList<String>(); 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<String> (); + this.templateVars = new LinkedList<String>(); 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<String, Object> infoHash; - String info; + HashMap<String, Object> infoHash; + String info; + + /** + * Instantiates a new AAI exception with info. + * + * @param infoHash the info hash + * @param info the info + */ + public AAIExceptionWithInfo(HashMap<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> infoHash, String info) { - super(code, details); - setInfoHash(infoHash); - setInfo(info); - } + /** + * Gets the info hash. + * + * @return the info hash + */ + public HashMap<String, Object> 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<String, Object> 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<String, Object> infoHash, String info) { - super(code, cause, details); - setInfoHash(infoHash); - setInfo(info); - } - - /** - * Gets the info hash. - * - * @return the info hash - */ - public HashMap<String, Object> getInfoHash() { - return infoHash; - } + /** + * Sets the info hash. + * + * @param infoHash the info hash + */ + public void setInfoHash(HashMap<String, Object> infoHash) { + this.infoHash = infoHash; + } - /** - * Sets the info hash. - * - * @param infoHash the info hash - */ - public void setInfoHash(HashMap<String, Object> 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<String> (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<String> 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<String, Object> lookupHashMap; - private HashMap<String, ArrayList<String>> precheckAddedList; - private AAIResponseMessages precheckResponseMessages; - private HashMap<String, Object> topology; - private HashMap<String, Vertex> 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<String> _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<String> getTemplateVars() { - if (this.templateVars == null) { - this.templateVars = new ArrayList<String>(); - } - 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<String, Object> getLookupHashMap() { - if (this.lookupHashMap == null) { - this.lookupHashMap = new HashMap<String, Object>(); - } - return this.lookupHashMap; - } - - /** - * Sets the lookup hash map. - * - * @param lookupHashMap the lookup hash map - */ - public void setLookupHashMap(HashMap<String, Object> lookupHashMap) { - this.lookupHashMap = lookupHashMap; - } - - /** - * Gets the precheck added list. - * - * @return the precheck added list - */ - public HashMap<String, ArrayList<String>> getPrecheckAddedList() { - if (this.precheckAddedList == null) { - this.precheckAddedList = new HashMap<String, ArrayList<String>>(); - } - return precheckAddedList; - } - - /** - * Sets the precheck added list. - * - * @param precheckAddedList the precheck added list - */ - public void setPrecheckAddedList(HashMap<String, ArrayList<String>> 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<String, Object> getTopology() { - if (this.topology == null) { - this.topology = new HashMap<String, Object>(); - } - return topology; - } - - /** - * Gets the vertex cache. - * - * @return the vertex cache - */ - public HashMap<String, Vertex> getVertexCache() { - if (this.vertexCache == null) { - this.vertexCache = new HashMap<String, Vertex>(); - } - 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<String> (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<String> 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<String, Object> lookupHashMap; + private HashMap<String, ArrayList<String>> precheckAddedList; + private AAIResponseMessages precheckResponseMessages; + private HashMap<String, Object> topology; + private HashMap<String, Vertex> 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<String> _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<String> getTemplateVars() { + if (this.templateVars == null) { + this.templateVars = new ArrayList<String>(); + } + 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<String, Object> getLookupHashMap() { + if (this.lookupHashMap == null) { + this.lookupHashMap = new HashMap<String, Object>(); + } + return this.lookupHashMap; + } + + /** + * Sets the lookup hash map. + * + * @param lookupHashMap the lookup hash map + */ + public void setLookupHashMap(HashMap<String, Object> lookupHashMap) { + this.lookupHashMap = lookupHashMap; + } + + /** + * Gets the precheck added list. + * + * @return the precheck added list + */ + public HashMap<String, ArrayList<String>> getPrecheckAddedList() { + if (this.precheckAddedList == null) { + this.precheckAddedList = new HashMap<String, ArrayList<String>>(); + } + return precheckAddedList; + } + + /** + * Sets the precheck added list. + * + * @param precheckAddedList the precheck added list + */ + public void setPrecheckAddedList(HashMap<String, ArrayList<String>> 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<String, Object> getTopology() { + if (this.topology == null) { + this.topology = new HashMap<String, Object>(); + } + return topology; + } + + /** + * Gets the vertex cache. + * + * @return the vertex cache + */ + public HashMap<String, Vertex> getVertexCache() { + if (this.vertexCache == null) { + this.vertexCache = new HashMap<String, Vertex>(); + } + 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<Vertex> 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<Vertex> 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<Vertex> lagIntQuery = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder() - .exactMatchQuery(lint) - .createEdgeTraversal(EdgeType.TREE, linterface, lagInterfaceForTrav).dedup(); - List<Vertex> 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<Vertex> gvVPEquery = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder() - .exactMatchQuery(lagInterfaceForTrav) - .createEdgeTraversal(EdgeType.TREE, lagInterfaceForTrav, gvVPEforTrav).dedup(); - List<Vertex> 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<DBRequest> createOrphanLInterfaceDelRequests(AAIExtensionMap aaiReqMap, Introspector newvce) throws AAIException, UnsupportedEncodingException, URISyntaxException{ - List<DBRequest> requests = new ArrayList<>(); - QueryBuilder<Vertex> query = createLInterfaceQuery(aaiReqMap, newvce); - List<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> lagIntQuery = aaiReqMap.getTransactionalGraphEngine().getQueryBuilder() + .exactMatchQuery(lint).createEdgeTraversal(EdgeType.TREE, linterface, lagInterfaceForTrav).dedup(); + List<Vertex> 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<Vertex> gvVPEquery = + aaiReqMap.getTransactionalGraphEngine().getQueryBuilder().exactMatchQuery(lagInterfaceForTrav) + .createEdgeTraversal(EdgeType.TREE, lagInterfaceForTrav, gvVPEforTrav).dedup(); + List<Vertex> 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<DBRequest> createOrphanLInterfaceDelRequests(AAIExtensionMap aaiReqMap, Introspector newvce) + throws AAIException, UnsupportedEncodingException, URISyntaxException { + List<DBRequest> requests = new ArrayList<>(); + QueryBuilder<Vertex> query = createLInterfaceQuery(aaiReqMap, newvce); + List<Vertex> 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<String> processedWidgets = new ArrayList<String>(); - for (Entry<String, Introspector> 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<String> 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<Object> 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<String> processedWidgets = new ArrayList<String>(); + for (Entry<String, Introspector> 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<String> 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<Object> 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<String> uniqueProperties = null; - private Set<String> indexedProperties = null; - private Set<String> allKeys = null; + protected String className; + protected String uriChain = ""; + protected Loader loader; + protected final NamingExceptions namingException = NamingExceptions.getInstance(); + private Set<String> uniqueProperties = null; + private Set<String> indexedProperties = null; + private Set<String> 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> 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<Introspector> getWrappedListValue(String name) { + String convertedName = convertPropertyName(name); + Object value = null; + List<Introspector> 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<Object> valueList = (List<Object>) 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> 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<Introspector> getWrappedListValue(String name) { - String convertedName = convertPropertyName(name); - Object value = null; - List<Introspector> 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<Object> valueList = (List<Object>)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<Object> castValueAccordingToSchema(String name, List<?> objs) { - List<Object> 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<String> getProperties(); - - public Set<String> getProperties(PropertyPredicate<Introspector, String> p) { - final Set<String> temp = new LinkedHashSet<>(); - this.getProperties().stream().filter(item -> { - return p.test(this, item); - }).forEach(item -> { - temp.add(item); - }); - final Set<String> result = Collections.unmodifiableSet(temp); - - return result; - - } - - public Set<String> getSimpleProperties(PropertyPredicate<Introspector, String> 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<String> getRequiredProperties(); - /** - * - * @return a list of the properties that can be used to query the object in the db - */ - public abstract Set<String> getKeys(); - /** - * - * @return a list of the all key properties for this object - */ - public Set<String> getAllKeys() { - Set<String> result = null; - if (this.allKeys == null) { - Set<String> 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<String> getIndexedProperties() { - Set<String> result = null; - - if (this.indexedProperties == null) { - result = new LinkedHashSet<>(); - Set<String> 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<String> getUniqueProperties() { - Set<String> 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<String> 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<String> 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<PropertyMetadata, String> getPropertyMetadata(String propName); - public Optional<String> getPropertyMetadata(String propName, PropertyMetadata metadataName) { - final String resultValue = this.getPropertyMetadata(propName).getOrDefault(metadataName, ""); - Optional<String> 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<Object> castValueAccordingToSchema(String name, List<?> objs) { + List<Object> 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<String> getProperties(); + + public Set<String> getProperties(PropertyPredicate<Introspector, String> p) { + final Set<String> temp = new LinkedHashSet<>(); + this.getProperties().stream().filter(item -> { + return p.test(this, item); + }).forEach(item -> { + temp.add(item); + }); + final Set<String> result = Collections.unmodifiableSet(temp); + + return result; + + } + + public Set<String> getSimpleProperties(PropertyPredicate<Introspector, String> 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<String> getRequiredProperties(); + + /** + * + * @return a list of the properties that can be used to query the object in the db + */ + public abstract Set<String> getKeys(); + + /** + * + * @return a list of the all key properties for this object + */ + public Set<String> getAllKeys() { + Set<String> result = null; + if (this.allKeys == null) { + Set<String> 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<String> getIndexedProperties() { + Set<String> result = null; + + if (this.indexedProperties == null) { + result = new LinkedHashSet<>(); + Set<String> 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<String> getUniqueProperties() { + Set<String> 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<String> 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<String> 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<PropertyMetadata, String> getPropertyMetadata(String propName); + + public Optional<String> getPropertyMetadata(String propName, PropertyMetadata metadataName) { + final String resultValue = this.getPropertyMetadata(propName).getOrDefault(metadataName, ""); + Optional<String> 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<String> blacklist = null; - private boolean preventCycles = false; - private final PropertyPredicate<Introspector, String> 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<Introspector, String> p) { - this.w = w; - this.blacklist = new HashSet<>(); - this.propVisibility = p; - } - - - /** - * Sets the blacklist. - * - * @param list the new blacklist - */ - public void setBlacklist(List<String> 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<String> 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<String> visited) throws AAIException { - boolean stopRecursion = false; - Set<String> 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<String> 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<Object> listReference = obj.getValue(prop); - boolean isComplexType = obj.isComplexGenericType(prop); - if (isComplexType) { - List<Introspector> 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<String> blacklist = null; + private boolean preventCycles = false; + private final PropertyPredicate<Introspector, String> 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<Introspector, String> p) { + this.w = w; + this.blacklist = new HashSet<>(); + this.propVisibility = p; + } + + /** + * Sets the blacklist. + * + * @param list the new blacklist + */ + public void setBlacklist(List<String> 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<String> 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<String> visited) throws AAIException { + boolean stopRecursion = false; + Set<String> 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<String> 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<Object> listReference = obj.getValue(prop); + boolean isComplexType = obj.isComplexGenericType(prop); + if (isComplexType) { + List<Introspector> 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<String> 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<String> getProperties() { - Set<String> result = json.keySet(); - return result; - } - - @Override - public Set<String> getRequiredProperties() { - //unknowable - - return this.getProperties(); - } - - @Override - public Set<String> getKeys() { - //unknowable - return this.getProperties(); - } - - @Override - public Set<String> 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<String> 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<String> 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<PropertyMetadata, String> 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<String> 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<String> getProperties() { + Set<String> result = json.keySet(); + return result; + } + + @Override + public Set<String> getRequiredProperties() { + // unknowable + + return this.getProperties(); + } + + @Override + public Set<String> getKeys() { + // unknowable + return this.getProperties(); + } + + @Override + public Set<String> 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<String> 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<String> 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<PropertyMetadata, String> 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<String, Introspector> getAllObjects(); + public abstract Map<String, Introspector> getAllObjects(); public abstract Set<String> 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<SchemaVersion, MoxyLoader> moxyLoaderInstance; + @Autowired + public Map<SchemaVersion, MoxyLoader> moxyLoaderInstance; - public LoaderFactory(Map<SchemaVersion, MoxyLoader> moxyLoaderInstance) { - this.moxyLoaderInstance = moxyLoaderInstance; - } + public LoaderFactory(Map<SchemaVersion, MoxyLoader> 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<SchemaVersion, MoxyLoader> getMoxyLoaderInstance() { - return moxyLoaderInstance; - } + public Map<SchemaVersion, MoxyLoader> getMoxyLoaderInstance() { + return moxyLoaderInstance; + } - public void setMoxyLoaderInstance(Map<SchemaVersion, MoxyLoader> moxyLoaderInstance) { - this.moxyLoaderInstance = moxyLoaderInstance; - } + public void setMoxyLoaderInstance(Map<SchemaVersion, MoxyLoader> 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<String, Introspector> allObjs = null; + private DynamicJAXBContext jaxbContext = null; + private Map<String, Introspector> allObjs = null; - private Map<SchemaVersion, MoxyLoader> moxyLoaderFactory; + private Map<SchemaVersion, MoxyLoader> moxyLoaderFactory; - private NodeIngestor nodeIngestor; - private CaseFormatStore caseFormatStore; + private NodeIngestor nodeIngestor; + private CaseFormatStore caseFormatStore; - private Set<String> namedProps; + private Set<String> 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<String, Introspector> getAllObjects() { - if (this.allObjs != null) { - return allObjs; - } else { - ImmutableMap.Builder<String, Introspector> map = new ImmutableMap.Builder<>(); - Set<String> 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<String> objectsInVersion() { - Set<String> 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<String> 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<String, Introspector> getAllObjects() { + if (this.allObjs != null) { + return allObjs; + } else { + ImmutableMap.Builder<String, Introspector> map = new ImmutableMap.Builder<>(); + Set<String> 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<String> objectsInVersion() { + Set<String> 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<String> 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<String> properties = null; - private Set<String> keys = null; - private Set<String> 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<String> 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<String> properties = null; + private Set<String> keys = null; + private Set<String> 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<String> 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<String> 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<String> keys = new LinkedHashSet<>(); - Set<String> 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<String> 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<String> getProperties() { - - if(!isInitialized){ - init(); - } - - return this.properties; - - } - - @Override - public Set<String> getRequiredProperties() { - - if(!isInitialized){ - init(); - } - - return this.requiredProperties; - } - - @Override - public Set<String> getKeys() { - - if(!isInitialized){ - init(); - } - - return this.keys; - } - - @Override - public Map<PropertyMetadata, String> getPropertyMetadata(String prop) { - String propName = this.convertPropertyName(prop); - DatabaseMapping mapping = cd.getMappingForAttributeName(propName); - Map<PropertyMetadata, String> result = new HashMap<>(); - if (mapping != null) { - Set<Entry> 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<String> getProperties() { - @Override - protected String findKey() throws UnsupportedEncodingException { - Set<String> keys = null; - keys = this.getKeys(); - List<String> 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<String> getRequiredProperties() { - } + if (!isInitialized) { + init(); + } - } - result = Joiner.on("/").join(Arrays.copyOfRange(split, 0, i)); + return this.requiredProperties; + } - return result; + @Override + public Set<String> getKeys() { - } + if (!isInitialized) { + init(); + } - @Override - public String marshal(MarshallerProperties properties) { - StringWriter result = new StringWriter(); + return this.keys; + } + + @Override + public Map<PropertyMetadata, String> getPropertyMetadata(String prop) { + String propName = this.convertPropertyName(prop); + DatabaseMapping mapping = cd.getMappingForAttributeName(propName); + Map<PropertyMetadata, String> result = new HashMap<>(); + if (mapping != null) { + Set<Entry> 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<String> keys = null; + keys = this.getKeys(); + List<String> 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<Introspector, String> includeInTestGeneration() { - return (obj, prop) -> { - final Map<PropertyMetadata, String> 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<Introspector, String> isVisible() { - return (obj, prop) -> { - final Map<PropertyMetadata, String> map = obj.getPropertyMetadata(prop); - if (map.containsKey(PropertyMetadata.VISIBILITY)) { - return !Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY))); - } - return true; - }; - } - - public static PropertyPredicate<Introspector, String> includeInExamples() { - return (obj, prop) -> { - final Map<PropertyMetadata, String> 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<Introspector, String> isIndexed() { - return (obj, prop) -> { - Set<String> indexed = obj.getIndexedProperties(); - return indexed.contains(prop); - }; - } + private PropertyPredicates() { + + } + + public static PropertyPredicate<Introspector, String> includeInTestGeneration() { + return (obj, prop) -> { + final Map<PropertyMetadata, String> 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<Introspector, String> isVisible() { + return (obj, prop) -> { + final Map<PropertyMetadata, String> map = obj.getPropertyMetadata(prop); + if (map.containsKey(PropertyMetadata.VISIBILITY)) { + return !Visibility.internal.equals(Visibility.valueOf(map.get(PropertyMetadata.VISIBILITY))); + } + return true; + }; + } + + public static PropertyPredicate<Introspector, String> includeInExamples() { + return (obj, prop) -> { + final Map<PropertyMetadata, String> 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<Introspector, String> isIndexed() { + return (obj, prop) -> { + Set<String> 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<Introspector> list, List<Object> 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<Introspector> list, List<Object> 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<String> 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<Object> 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<Introspector> list, List<Object> 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<String> 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<Object> 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<Introspector> list, List<Object> 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<String> completeUri, Entry<String, String> entry) + throws URISyntaxException, UnsupportedEncodingException, AAIException { + if (completeUri.isPresent()) { + URI uri = new URI(completeUri.get()); + MultivaluedMap<String, String> map = URITools.getQueryMap(uri); + QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map); + List<Vertex> 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<String> completeUri, Entry<String, String> entry) throws URISyntaxException, UnsupportedEncodingException, AAIException { - if (completeUri.isPresent()) { - URI uri = new URI(completeUri.get()); - MultivaluedMap<String, String> map = URITools.getQueryMap(uri); - QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map); - List<Vertex> 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<String> completeUri, Entry<String, String> entry) + throws URISyntaxException, UnsupportedEncodingException, AAIException { + + if (completeUri.isPresent()) { + URI uri = new URI(completeUri.get()); + MultivaluedMap<String, String> map = URITools.getQueryMap(uri); + QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map); + List<Vertex> results = + uriQuery.getQueryBuilder().getVerticesByProperty(AAIProperties.LINKED, true).toList(); + if (results.size() == 1) { + if (results.get(0).<Boolean>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<String> completeUri, Entry<String, String> entry) - throws URISyntaxException, UnsupportedEncodingException, AAIException { + /** + * always fuzzy search on reads + */ + @Override + protected Map<String, String> findProperties(Introspector obj, String uriString) + throws AAIMissingRequiredPropertyException { - if (completeUri.isPresent()) { - URI uri = new URI(completeUri.get()); - MultivaluedMap<String, String> map = URITools.getQueryMap(uri); - QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map); - List<Vertex> results = uriQuery.getQueryBuilder().getVerticesByProperty(AAIProperties.LINKED, true).toList(); - if (results.size() == 1) { - if (results.get(0).<Boolean>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<String, String> findProperties(Introspector obj, String uriString) throws AAIMissingRequiredPropertyException { - - final Map<String, String> 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<String, String> 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<String> completeUri, Entry<String, String> entry) + throws URISyntaxException, UnsupportedEncodingException, AAIException { + if (completeUri.isPresent()) { + URI uri = new URI(completeUri.get()); + MultivaluedMap<String, String> map = URITools.getQueryMap(uri); + QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map); + List<Vertex> results = uriQuery.getQueryBuilder().toList(); + if (results.size() == 1) { + if (results.get(0).<Boolean>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<Vertex> 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<String> completeUri, Entry<String, String> entry) - throws URISyntaxException, UnsupportedEncodingException, AAIException { - if (completeUri.isPresent()) { - URI uri = new URI(completeUri.get()); - MultivaluedMap<String, String> map = URITools.getQueryMap(uri); - QueryParser uriQuery = dbEngine.getQueryBuilder(this.latestLoader).createQueryFromURI(uri, map); - List<Vertex> results = uriQuery.getQueryBuilder().toList(); - if (results.size() == 1) { - if (results.get(0).<Boolean>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<Vertex> 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<String> completeUri, Entry<String, String> entry) throws URISyntaxException, UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { + protected void processURI(Optional<String> completeUri, Entry<String, String> 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<Vertex> vertices = new ArrayList<>(); vertices.add(self); @@ -76,8 +80,9 @@ public class PrivateEdge extends SideEffect { } } - private void process(Optional<String> completeUri, Entry<String, String> entry) throws URISyntaxException, UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { - if(completeUri.isPresent()){ + private void process(Optional<String> completeUri, Entry<String, String> entry) throws URISyntaxException, + UnsupportedEncodingException, AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException { + if (completeUri.isPresent()) { URI uri = new URI(completeUri.get()); MultivaluedMap<String, String> 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<String, EdgeRule> 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<String, EdgeRule> edgeEntry : edgeRulesMap.entries()) { EdgeRule edgeRule = edgeIngestor.getRule(edgeQuery); Iterator<Edge> 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<PropertyMetadata, String> map = obj.getPropertyMetadata(key); String oldVertexValue = null; - if(map.containsKey(PropertyMetadata.DB_ALIAS)){ + if (map.containsKey(PropertyMetadata.DB_ALIAS)) { oldVertexValue = self.<String>property(key + AAIProperties.DB_ALIAS_SUFFIX).orElse(null); } else { oldVertexValue = self.<String>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<String> 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<String, String> properties = this.findPopertiesWithMetadata(obj, this.getPropertyMetadata()); - for (Entry<String, String> entry : properties.entrySet()) { - Optional<String> populatedUri = this.replaceTemplates(obj, entry.getValue()); - Optional<String> 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<String, String> findPopertiesWithMetadata(Introspector obj, PropertyMetadata metadata) { - final Map<String, String> result = new HashMap<>(); - for (String prop : obj.getProperties()) { - final Map<PropertyMetadata, String> map = obj.getPropertyMetadata(prop); - if (map.containsKey(metadata)) { - result.put(prop, map.get(metadata)); - } - } - return result; - } - - protected Map<String, String> findProperties(Introspector obj, String uriString) throws AAIMissingRequiredPropertyException { - - final Map<String, String> result = new HashMap<>(); - final Set<String> 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<String> replaceTemplates(Introspector obj, String uriString) throws AAIMissingRequiredPropertyException { - String result = uriString; - final Map<String, String> propMap = this.findProperties(obj, uriString); - if (propMap.isEmpty()) { - return Optional.empty(); - } - for (Entry<String, String> 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<String> resolveRelativePath(Optional<String> 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<String> completeUri, Entry<String, String> 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<String> 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<String, String> properties = this.findPopertiesWithMetadata(obj, this.getPropertyMetadata()); + for (Entry<String, String> entry : properties.entrySet()) { + Optional<String> populatedUri = this.replaceTemplates(obj, entry.getValue()); + Optional<String> 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<String, String> findPopertiesWithMetadata(Introspector obj, PropertyMetadata metadata) { + final Map<String, String> result = new HashMap<>(); + for (String prop : obj.getProperties()) { + final Map<PropertyMetadata, String> map = obj.getPropertyMetadata(prop); + if (map.containsKey(metadata)) { + result.put(prop, map.get(metadata)); + } + } + return result; + } + + protected Map<String, String> findProperties(Introspector obj, String uriString) + throws AAIMissingRequiredPropertyException { + + final Map<String, String> result = new HashMap<>(); + final Set<String> 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<String> replaceTemplates(Introspector obj, String uriString) + throws AAIMissingRequiredPropertyException { + String result = uriString; + final Map<String, String> propMap = this.findProperties(obj, uriString); + if (propMap.isEmpty()) { + return Optional.empty(); + } + for (Entry<String, String> 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<String> resolveRelativePath(Optional<String> 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<String> completeUri, Entry<String, String> 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<Class<? extends SideEffect>> 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<? extends SideEffect> 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<Class<? extends SideEffect>> sideEffects; - - public Builder(final TransactionalGraphEngine dbEngine, final DBSerializer serializer) { - this.dbEngine = dbEngine; - this.serializer = serializer; - this.sideEffects = new LinkedHashSet<>(); - } - - public Builder addSideEffect(Class<? extends SideEffect> se) { - sideEffects.add(se); - return this; - } - - public Builder addSideEffects(Class<? extends SideEffect>... sideEffects) { - for (Class<? extends SideEffect> 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<Class<? extends SideEffect>> getSideEffects() { - return sideEffects; - } - } + protected final TransactionalGraphEngine dbEngine; + protected final DBSerializer serializer; + protected final Set<Class<? extends SideEffect>> 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<? extends SideEffect> 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<Class<? extends SideEffect>> sideEffects; + + public Builder(final TransactionalGraphEngine dbEngine, final DBSerializer serializer) { + this.dbEngine = dbEngine; + this.serializer = serializer; + this.sideEffects = new LinkedHashSet<>(); + } + + public Builder addSideEffect(Class<? extends SideEffect> se) { + sideEffects.add(se); + return this; + } + + public Builder addSideEffects(Class<? extends SideEffect>... sideEffects) { + for (Class<? extends SideEffect> 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<Class<? extends SideEffect>> 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<Class<? extends SideEffect>> sideEffects; - protected SideEffectRunnerHelper(final TransactionalGraphEngine dbEngine, final DBSerializer serializer, final Set<Class<? extends SideEffect>> sideEffects) { - this.dbEngine = dbEngine; - this.serializer = serializer; - this.sideEffects = sideEffects; - } - - private void runSideEffects(Introspector obj) throws AAIException { - for (Class<? extends SideEffect> 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<Introspector> list, List<Object> listReference, Introspector parent, - Introspector child) { - // TODO Auto-generated method stub - - } + protected final TransactionalGraphEngine dbEngine; + protected final DBSerializer serializer; + protected final Set<Class<? extends SideEffect>> sideEffects; + + protected SideEffectRunnerHelper(final TransactionalGraphEngine dbEngine, final DBSerializer serializer, + final Set<Class<? extends SideEffect>> sideEffects) { + this.dbEngine = dbEngine; + this.serializer = serializer; + this.sideEffects = sideEffects; + } + + private void runSideEffects(Introspector obj) throws AAIException { + for (Class<? extends SideEffect> 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<Introspector> list, List<Object> 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; + /** * <b>CreateUUID</b> 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<PropertyMetadata, String> 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<PropertyMetadata, String> 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<PropertyMetadata, String> 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<PropertyMetadata, String> 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<Issue> issues = null; - private List<IssueResolver> issueResolvers = null; - private boolean validateRequired = true; - private final int maximumDepth; - private int currentDepth = 0; - - private final Set<String> 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<Issue> getIssues() { - return this.issues; - } - - /** - * Sets the issue resolvers. - * - * @param resolvers the new issue resolvers - */ - public void setIssueResolvers(List<IssueResolver> 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<String> requiredProps = obj.getRequiredProperties(); - Set<String> keys = obj.getKeys(); - Set<String> 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<String> 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<String> 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<Introspector> list, List<Object> 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<IssueResolver> issueResolvers = null; - private int maximumDepth = AAIProperties.MAXIMUM_DEPTH; - /** - * Instantiates a new builder. - * - * @param llBuilder the ll builder - */ - public Builder() { - issueResolvers = new ArrayList<IssueResolver>(); - } - - /** - * 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<IssueResolver> getResolvers() { - return this.issueResolvers; - } - - public int getMaximumDepth() { - return this.maximumDepth; - } - } - + private List<Issue> issues = null; + private List<IssueResolver> issueResolvers = null; + private boolean validateRequired = true; + private final int maximumDepth; + private int currentDepth = 0; + + private final Set<String> 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<Issue> getIssues() { + return this.issues; + } + + /** + * Sets the issue resolvers. + * + * @param resolvers the new issue resolvers + */ + public void setIssueResolvers(List<IssueResolver> 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<String> requiredProps = obj.getRequiredProperties(); + Set<String> keys = obj.getKeys(); + Set<String> 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<String> 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<String> 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<Introspector> list, List<Object> 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<IssueResolver> issueResolvers = null; + private int maximumDepth = AAIProperties.MAXIMUM_DEPTH; + + /** + * Instantiates a new builder. + * + * @param llBuilder the ll builder + */ + public Builder() { + issueResolvers = new ArrayList<IssueResolver>(); + } + + /** + * 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<IssueResolver> 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<String, ErrorObject> ERROR_OBJECTS = new HashMap<String, ErrorObject> (); - - 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<Object, Object> 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<String> variables) { - List<MediaType> acceptHeaders = new ArrayList<MediaType>(); - 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<MediaType> acceptHeadersOrig, AAIException are, ArrayList<String> variables) { - - - StringBuilder text = new StringBuilder(); - String response = null; - - List<MediaType> acceptHeaders = new ArrayList<MediaType>(); - // 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<String>(); - } - - 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<MediaType> acceptHeadersOrig, AAIException are, ArrayList<String> 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<MediaType> acceptHeaders, HashMap<AAIException,ArrayList<String>> 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<Entry<AAIException, ArrayList<String>>> it = areList.entrySet().iterator(); - - while (it.hasNext()) { - Entry<AAIException,ArrayList<String>> pair = (Entry<AAIException, ArrayList<String>>)it.next(); - AAIException are = pair.getKey(); - ArrayList<String> 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<String>(); - } - - 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<String> 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<String>(); - } - - 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)); - } + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ErrorLogHelper.class); + private static final HashMap<String, ErrorObject> ERROR_OBJECTS = new HashMap<String, ErrorObject>(); + + 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<Object, Object> 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<String> variables) { + List<MediaType> acceptHeaders = new ArrayList<MediaType>(); + 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<MediaType> acceptHeadersOrig, AAIException are, + ArrayList<String> variables) { + + StringBuilder text = new StringBuilder(); + String response = null; + + List<MediaType> acceptHeaders = new ArrayList<MediaType>(); + // 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<String>(); + } + + 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<MediaType> acceptHeadersOrig, AAIException are, + ArrayList<String> 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<MediaType> acceptHeaders, + HashMap<AAIException, ArrayList<String>> 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<Entry<AAIException, ArrayList<String>>> it = areList.entrySet().iterator(); + + while (it.hasNext()) { + Entry<AAIException, ArrayList<String>> pair = (Entry<AAIException, ArrayList<String>>) it.next(); + AAIException are = pair.getKey(); + ArrayList<String> 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<String>(); + } + + 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<String> 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<String>(); + } + + 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<String, String> 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<String, String> 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<String> 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 <dependencies>. Had they put it into the <dependencyManagement> 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<String, String> getCopy() { - final Map<String, String> copy = new HashMap<String, String> (); - - 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<String> 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 <dependencies>. Had they put it into the <dependencyManagement> 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<String, String> getCopy() { + final Map<String, String> copy = new HashMap<String, String>(); + + 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String> values = uriKeys.get(key); - String dbPropertyName = key; - Map<String, String> linkedProperties = new HashMap<>(); - final Map<PropertyMetadata, String> 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<String, String> uriKeys, Map<String, String> linkedProperties) throws AAIException { - - QueryBuilder[] builders = new QueryBuilder[linkedProperties.keySet().size()]; - Set<Entry<String, String>> entrySet = linkedProperties.entrySet(); - int i = 0; - Iterator<Entry<String, String>> itr = entrySet.iterator(); - - while (itr.hasNext()) { - Entry<String, String> 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<String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String> values = uriKeys.get(key); + String dbPropertyName = key; + Map<String, String> linkedProperties = new HashMap<>(); + final Map<PropertyMetadata, String> 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<String, String> uriKeys, + Map<String, String> linkedProperties) throws AAIException { + + QueryBuilder[] builders = new QueryBuilder[linkedProperties.keySet().size()]; + Set<Entry<String, String>> entrySet = linkedProperties.entrySet(); + int i = 0; + Iterator<Entry<String, String>> itr = entrySet.iterator(); + + while (itr.hasNext()) { + Entry<String, String> 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<String> 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<Vertex> queryBuilder = null; - - protected QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> queryBuilder = null; + + protected QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> queryParams) - throws UnsupportedEncodingException, AAIException { - return new LegacyQueryParser(loader, builder, uri, queryParams); - } + /** + * @{inheritDoc} + */ + @Override + public QueryParser buildURIParser(URI uri, MultivaluedMap<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<URI> 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<URI> processRelationshipData() throws AAIException, UnsupportedEncodingException { + Optional<URI> result = Optional.empty(); + StringBuilder uriBuilder = new StringBuilder(); + List<Object> data = (List<Object>) relationship.getValue("relationship-data"); + Introspector wrapper; + String key; + String value; + String objectType; + String propertyName; + String topLevelType = null; + String[] split; + HashMap<String, Introspector> 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<String> 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<String> 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<URI> 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<URI> processRelatedLink(String relatedLink) + throws URISyntaxException, UnsupportedEncodingException, AAIIdentityMapParseException { + Optional<URI> 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<URI> processRelationshipData() throws AAIException, UnsupportedEncodingException { - Optional<URI> result = Optional.empty(); - StringBuilder uriBuilder = new StringBuilder(); - List<Object> data = (List<Object>)relationship.getValue("relationship-data"); - Introspector wrapper; - String key; - String value; - String objectType; - String propertyName; - String topLevelType = null; - String[] split; - HashMap<String, Introspector> 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<String> 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<String> 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<String> 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<URI> processRelatedLink(String relatedLink) throws URISyntaxException, UnsupportedEncodingException, AAIIdentityMapParseException { - Optional<URI> 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<String> 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<String, String> 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<String, String> uriKeys, boolean isFinalContainer) throws AAIException; + /** + * + * @param obj + * @param type + * @param uriKeys + * @throws AAIException + */ + void processObject(Introspector obj, EdgeType type, MultivaluedMap<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String> 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<String, String> uriKeys = new MultivaluedHashMap<>(); - if (i == parts.length-2 && queryParams != null) { - Set<String> 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<String, String> uriKeys = new MultivaluedHashMap<>(); - i++; - if (i == parts.length && queryParams != null) { - Set<String> 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<String, String> uriKeys = new MultivaluedHashMap<>(); - - if (isFinalContainer && queryParams != null) { - Set<String> 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<String, String> 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<String, String> 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<String> 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<String, String> uriKeys = new MultivaluedHashMap<>(); + if (i == parts.length - 2 && queryParams != null) { + Set<String> 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<String, String> uriKeys = new MultivaluedHashMap<>(); + i++; + if (i == parts.length && queryParams != null) { + Set<String> 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<String, String> uriKeys = new MultivaluedHashMap<>(); + + if (isFinalContainer && queryParams != null) { + Set<String> 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<String> 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<String, String> 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<String, String> uriKeys, - boolean isFinalContainer) { - } + private List<String> 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<String, String> 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<String, String> 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<String> 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<String, String> 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<String, String> uriKeys, - boolean isFinalContainer) throws AAIException { - pieces.add(toUpperCamel(obj.getName())); - } + private String namespace = ""; + + private String methodName = ""; + + private String topObject = ""; + + private List<String> 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<String, String> 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<String, String> 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<Object> parentList = null; - - private SchemaVersion version = null; - private Loader loader = null; - private final HashMap<String, Introspector> 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<String, Introspector> 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<Object> 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<String, String> uriKeys) - throws AAIException { - - if (this.entityName == null) { - this.topEntityName = obj.getDbName(); - this.topEntity = obj; - } - this.entityName = obj.getDbName(); - this.entity = obj; - this.parentList = (List<Object>)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<String, String> 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<Object> parentList = null; + + private SchemaVersion version = null; + private Loader loader = null; + private final HashMap<String, Introspector> 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<String, Introspector> 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<Object> 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<String, String> uriKeys) + throws AAIException { + + if (this.entityName == null) { + this.topEntityName = obj.getDbName(); + this.topEntity = obj; + } + this.entityName = obj.getDbName(); + this.entity = obj; + this.parentList = (List<Object>) 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<String, String> 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<String, String> 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<Object>)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<String, String> 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<String, String> 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<Object>) 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<String, String> 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<String, String> uriKeys) - throws AAIException { - //NO-OP - //just want to make sure this URI has valid tokens - } - - @Override - public void processContainer(Introspector obj, EdgeType type, MultivaluedMap<String, String> 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<String, String> uriKeys) + throws AAIException { + // NO-OP + // just want to make sure this URI has valid tokens + } + + @Override + public void processContainer(Introspector obj, EdgeType type, MultivaluedMap<String, String> 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<E> extends QueryBuilder<E> { - protected GraphTraversal<Vertex, E> traversal = null; - protected Admin<Vertex, E> completeTraversal = null; + protected GraphTraversal<Vertex, E> traversal = null; + protected Admin<Vertex, E> 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<Vertex, E>) __.<E>start(); + traversal = (GraphTraversal<Vertex, E>) __.<E>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<Vertex, E>) __.__(start); + traversal = (GraphTraversal<Vertex, E>) __.__(start); - } + } - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> getVerticesByProperty(String key, Object value) { + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> 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<Vertex>) this; - } + stepIndex++; + return (QueryBuilder<Vertex>) this; + } - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> getVerticesByProperty(final String key, final List<?> values) { + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> getVerticesByProperty(final String key, final List<?> values) { - //this is because the index is registered as an Integer - List<Object> correctedValues = new ArrayList<>(); - for (Object item : values) { - correctedValues.add(this.correctObjectType(item)); - } + // this is because the index is registered as an Integer + List<Object> 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<Vertex>) this; - } + stepIndex++; + return (QueryBuilder<Vertex>) this; + } - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> getVerticesStartsWithProperty(String key, Object value) { + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> 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<Vertex>) this; - } + stepIndex++; + return (QueryBuilder<Vertex>) this; + } /** * @{inheritDoc} @@ -147,37 +148,36 @@ public abstract class GraphTraversalBuilder<E> extends QueryBuilder<E> { return (QueryBuilder<Vertex>) this; } + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> getVerticesExcludeByProperty(String key, Object value) { - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> 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<Vertex>) this; - } + stepIndex++; + return (QueryBuilder<Vertex>) this; + } - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> getVerticesExcludeByProperty(final String key, final List<?> values) { + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> getVerticesExcludeByProperty(final String key, final List<?> values) { - //this is because the index is registered as an Integer - List<Object> correctedValues = new ArrayList<>(); - for (Object item : values) { - correctedValues.add(this.correctObjectType(item)); - } + // this is because the index is registered as an Integer + List<Object> 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<Vertex>) this; - } + stepIndex++; + return (QueryBuilder<Vertex>) this; + } @Override public QueryBuilder<Vertex> getVerticesGreaterThanProperty(final String key, Object value) { @@ -197,703 +197,709 @@ public abstract class GraphTraversalBuilder<E> extends QueryBuilder<E> { return (QueryBuilder<Vertex>) this; } + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> getChildVerticesFromParent(String parentKey, String parentValue, String childType) { + traversal.has(parentKey, parentValue).has(AAIProperties.NODE_TYPE, childType); + stepIndex++; + return (QueryBuilder<Vertex>) this; + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> getTypedVerticesByMap(String type, Map<String, String> map) { + + for (Map.Entry<String, String> es : map.entrySet()) { + traversal.has(es.getKey(), es.getValue()); + stepIndex++; + } + traversal.has(AAIProperties.NODE_TYPE, type); + stepIndex++; + return (QueryBuilder<Vertex>) this; + } + + @Override + public QueryBuilder<Vertex> 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<Vertex>) this; + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> createKeyQuery(Introspector obj) { + Set<String> keys = obj.getKeys(); + Object val; + for (String key : keys) { + val = obj.getValue(key); + Optional<String> 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<Vertex>) this; + } + + @Override + public QueryBuilder<Vertex> exactMatchQuery(Introspector obj) { + this.createKeyQuery(obj); + allPropertiesQuery(obj); + this.createContainerQuery(obj); + return (QueryBuilder<Vertex>) this; + } + + private void allPropertiesQuery(Introspector obj) { + Set<String> props = obj.getProperties(); + Set<String> keys = obj.getKeys(); + Object val; + for (String prop : props) { + if (obj.isSimpleType(prop) && !keys.contains(prop)) { + val = obj.getValue(prop); + if (val != null) { + Optional<String> 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<Vertex> 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<Vertex>) this; + } + + /** + * @throws NoEdgeRuleFoundException + * @throws AAIException + * @{inheritDoc} + */ + @Override + public QueryBuilder<Vertex> createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) + throws AAIException { + createTraversal(type, parent, child, false); + return (QueryBuilder<Vertex>) this; + + } + + @Override + public QueryBuilder<Vertex> createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child) + throws AAIException { + this.createTraversal(type, parent, child, true); + return (QueryBuilder<Vertex>) 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<Vertex> createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, + List<String> labels) throws AAIException { + this.edgeQueryToVertex(type, out, in, labels); + return (QueryBuilder<Vertex>) this; + } + + private Traversal<Vertex, Vertex>[] 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<Traversal<Vertex, Vertex>> 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<String, EdgeRule> rules = ArrayListMultimap.create(); + try { + rules = edgeRules.getRules(qB.edgeType(type).build()); + } catch (EdgeRuleNotFoundException e) { + throw new NoEdgeRuleFoundException(e); + } + + GraphTraversal<Vertex, Vertex> innerTraversal = __.start(); + + final List<String> inLabels = new ArrayList<>(); + final List<String> 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<Edge> getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, + List<String> labels) throws AAIException { + Introspector outObj = loader.introspectorFromName(outNodeType); + Introspector inObj = loader.introspectorFromName(inNodeType); + this.edgeQuery(type, outObj, inObj, labels); + + return (QueryBuilder<Edge>) this; + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> union(QueryBuilder... builder) { + GraphTraversal<Vertex, Vertex>[] traversals = new GraphTraversal[builder.length]; + for (int i = 0; i < builder.length; i++) { + traversals[i] = (GraphTraversal<Vertex, Vertex>) builder[i].getQuery(); + } + this.traversal.union(traversals); + stepIndex++; + + return this; + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> where(QueryBuilder... builder) { + for (int i = 0; i < builder.length; i++) { + this.traversal.where((GraphTraversal<Vertex, Vertex>) builder[i].getQuery()); + stepIndex++; + } - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> getChildVerticesFromParent(String parentKey, String parentValue, String childType) { - traversal.has(parentKey, parentValue).has(AAIProperties.NODE_TYPE, childType); - stepIndex++; - return (QueryBuilder<Vertex>) this; - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> getTypedVerticesByMap(String type, Map<String, String> map) { - - for (Map.Entry<String, String> es : map.entrySet()) { - traversal.has(es.getKey(), es.getValue()); - stepIndex++; - } - traversal.has(AAIProperties.NODE_TYPE, type); - stepIndex++; - return (QueryBuilder<Vertex>) this; - } - - @Override - public QueryBuilder<Vertex> 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<Vertex>) this; - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> createKeyQuery(Introspector obj) { - Set<String> keys = obj.getKeys(); - Object val; - for (String key : keys) { - val = obj.getValue(key); - Optional<String> 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<Vertex>) this; - } - - @Override - public QueryBuilder<Vertex> exactMatchQuery(Introspector obj) { - this.createKeyQuery(obj); - allPropertiesQuery(obj); - this.createContainerQuery(obj); - return (QueryBuilder<Vertex>) this; - } - - private void allPropertiesQuery(Introspector obj) { - Set<String> props = obj.getProperties(); - Set<String> keys = obj.getKeys(); - Object val; - for (String prop : props) { - if (obj.isSimpleType(prop) && !keys.contains(prop)) { - val = obj.getValue(prop); - if (val != null) { - Optional<String> 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<Vertex> 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<Vertex>) this; - } - - /** - * @throws NoEdgeRuleFoundException - * @throws AAIException - * @{inheritDoc} - */ - @Override - public QueryBuilder<Vertex> createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException { - createTraversal(type, parent, child, false); - return (QueryBuilder<Vertex>) this; - - } - - @Override - public QueryBuilder<Vertex> createPrivateEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException { - this.createTraversal(type, parent, child, true); - return (QueryBuilder<Vertex>) 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<Vertex> createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, List<String> labels) throws AAIException { - this.edgeQueryToVertex(type, out, in, labels); - return (QueryBuilder<Vertex>) this; - } - - private Traversal<Vertex, Vertex>[] 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<Traversal<Vertex, Vertex>> 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<String, EdgeRule> rules = ArrayListMultimap.create(); - try { - rules = edgeRules.getRules(qB.edgeType(type).build()); - } catch (EdgeRuleNotFoundException e) { - throw new NoEdgeRuleFoundException(e); - } - - GraphTraversal<Vertex, Vertex> innerTraversal = __.start(); - - final List<String> inLabels = new ArrayList<>(); - final List<String> 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<Edge> getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, List<String> labels) throws AAIException { - Introspector outObj = loader.introspectorFromName(outNodeType); - Introspector inObj = loader.introspectorFromName(inNodeType); - this.edgeQuery(type, outObj, inObj, labels); - - return (QueryBuilder<Edge>)this; - } - - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> union(QueryBuilder... builder) { - GraphTraversal<Vertex, Vertex>[] traversals = new GraphTraversal[builder.length]; - for (int i = 0; i < builder.length; i++) { - traversals[i] = (GraphTraversal<Vertex, Vertex>)builder[i].getQuery(); - } - this.traversal.union(traversals); - stepIndex++; - - return this; - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> where(QueryBuilder... builder) { - for (int i = 0; i < builder.length; i++) { - this.traversal.where((GraphTraversal<Vertex, Vertex>)builder[i].getQuery()); - stepIndex++; - } - - return this; - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> or(QueryBuilder... builder) { - GraphTraversal<Vertex, Vertex>[] traversals = new GraphTraversal[builder.length]; - for (int i = 0; i < builder.length; i++) { - traversals[i] = (GraphTraversal<Vertex, Vertex>)builder[i].getQuery(); - } - this.traversal.or(traversals); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> store(String name) { - - this.traversal.store(name); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> cap(String name) { - this.traversal.cap(name); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> unfold() { - this.traversal.unfold(); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> dedup() { - - this.traversal.dedup(); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> emit() { - - this.traversal.emit(); - stepIndex++; - - return this; - - } - - @Override - public QueryBuilder<E> repeat(QueryBuilder<E> builder) { - - this.traversal.repeat((GraphTraversal<Vertex, E>)builder.getQuery()); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> until(QueryBuilder<E> builder) { - this.traversal.until((GraphTraversal<Vertex,E>)builder.getQuery()); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> groupCount() { - this.traversal.groupCount(); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> both() { - this.traversal.both(); - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<Tree> tree() { - - this.traversal.tree(); - stepIndex++; - - return (QueryBuilder<Tree>)this; - } - - @Override - public QueryBuilder<E> by(String name) { - this.traversal.by(name); - stepIndex++; - - return this; - } - - /** - * {@inheritDoc} - */ - @Override - public QueryBuilder<E> simplePath(){ - this.traversal.simplePath(); - stepIndex++; - return this; - } - - /** - * {@inheritDoc} - */ - @Override - public QueryBuilder<Path> path(){ - this.traversal.path(); - stepIndex++; - return (QueryBuilder<Path>)this; - } - - @Override - public QueryBuilder<Edge> outE() { - this.traversal.outE(); - stepIndex++; - return (QueryBuilder<Edge>)this; - } - - @Override - public QueryBuilder<Edge> inE() { - this.traversal.inE(); - stepIndex++; - return (QueryBuilder<Edge>)this; - } - - @Override - public QueryBuilder<Vertex> outV() { - this.traversal.outV(); - stepIndex++; - return (QueryBuilder<Vertex>)this; - } - - @Override - public QueryBuilder<Vertex> inV() { - this.traversal.inV(); - stepIndex++; - return (QueryBuilder<Vertex>)this; - } - - @Override - public QueryBuilder<E> as(String name) { - this.traversal.as(name); - - stepIndex++; - return this; - } - - @Override - public QueryBuilder<E> not(QueryBuilder<E> builder) { - this.traversal.not(builder.getQuery()); - - stepIndex++; - return this; - } - - @Override - public QueryBuilder<E> select(String name) { - this.traversal.select(name); - - stepIndex++; - - return this; - } - - @Override - public QueryBuilder<E> 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<String> 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<String, EdgeRule> 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<String> inLabels = new ArrayList<>(); - final List<String> 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<String> 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<String, EdgeRule> 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<String> inLabels = new ArrayList<>(); - final List<String> 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<E> limit(long amount) { - traversal.limit(amount); - return this; - } - - /** - * @{inheritDoc} - */ - @Override - public <E2> E2 getQuery() { - return (E2)this.traversal; - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> getParentQuery() { - - return cloneQueryAtStep(parentStepIndex); - } - - @Override - public QueryBuilder<E> 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<E> 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<Vertex, E>) 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<E> toList() { - if (this.completeTraversal == null) { - executeQuery(); - } - return this.completeTraversal.toList(); - } - - protected QueryBuilder<Edge> has(String key, String value) { - traversal.has(key, value); - - return (QueryBuilder<Edge>)this; - } + return this; + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> or(QueryBuilder... builder) { + GraphTraversal<Vertex, Vertex>[] traversals = new GraphTraversal[builder.length]; + for (int i = 0; i < builder.length; i++) { + traversals[i] = (GraphTraversal<Vertex, Vertex>) builder[i].getQuery(); + } + this.traversal.or(traversals); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> store(String name) { + + this.traversal.store(name); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> cap(String name) { + this.traversal.cap(name); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> unfold() { + this.traversal.unfold(); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> dedup() { + + this.traversal.dedup(); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> emit() { + + this.traversal.emit(); + stepIndex++; + + return this; + + } + + @Override + public QueryBuilder<E> repeat(QueryBuilder<E> builder) { + + this.traversal.repeat((GraphTraversal<Vertex, E>) builder.getQuery()); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> until(QueryBuilder<E> builder) { + this.traversal.until((GraphTraversal<Vertex, E>) builder.getQuery()); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> groupCount() { + this.traversal.groupCount(); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> both() { + this.traversal.both(); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<Tree> tree() { + + this.traversal.tree(); + stepIndex++; + + return (QueryBuilder<Tree>) this; + } + + @Override + public QueryBuilder<E> by(String name) { + this.traversal.by(name); + stepIndex++; + + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public QueryBuilder<E> simplePath() { + this.traversal.simplePath(); + stepIndex++; + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public QueryBuilder<Path> path() { + this.traversal.path(); + stepIndex++; + return (QueryBuilder<Path>) this; + } + + @Override + public QueryBuilder<Edge> outE() { + this.traversal.outE(); + stepIndex++; + return (QueryBuilder<Edge>) this; + } + + @Override + public QueryBuilder<Edge> inE() { + this.traversal.inE(); + stepIndex++; + return (QueryBuilder<Edge>) this; + } + + @Override + public QueryBuilder<Vertex> outV() { + this.traversal.outV(); + stepIndex++; + return (QueryBuilder<Vertex>) this; + } + + @Override + public QueryBuilder<Vertex> inV() { + this.traversal.inV(); + stepIndex++; + return (QueryBuilder<Vertex>) this; + } + + @Override + public QueryBuilder<E> as(String name) { + this.traversal.as(name); + + stepIndex++; + return this; + } + + @Override + public QueryBuilder<E> not(QueryBuilder<E> builder) { + this.traversal.not(builder.getQuery()); + + stepIndex++; + return this; + } + + @Override + public QueryBuilder<E> select(String name) { + this.traversal.select(name); + + stepIndex++; + + return this; + } + + @Override + public QueryBuilder<E> 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<String> 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<String, EdgeRule> 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<String> inLabels = new ArrayList<>(); + final List<String> 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<String> 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<String, EdgeRule> 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<String> inLabels = new ArrayList<>(); + final List<String> 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<E> limit(long amount) { + traversal.limit(amount); + return this; + } + + /** + * @{inheritDoc} + */ + @Override + public <E2> E2 getQuery() { + return (E2) this.traversal; + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> getParentQuery() { + + return cloneQueryAtStep(parentStepIndex); + } + + @Override + public QueryBuilder<E> 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<E> 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<Vertex, E>) 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<E> toList() { + if (this.completeTraversal == null) { + executeQuery(); + } + return this.completeTraversal.toList(); + } + + protected QueryBuilder<Edge> has(String key, String value) { + traversal.has(key, value); + + return (QueryBuilder<Edge>) 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<E> extends QueryBuilder<E> { public QueryBuilder<Vertex> 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<E> extends QueryBuilder<E> { @Override public QueryBuilder<Vertex> 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<Vertex>) this; } @@ -182,7 +183,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { 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<E> extends QueryBuilder<E> { 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<E> extends QueryBuilder<E> { public QueryBuilder<Vertex> 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<E> extends QueryBuilder<E> { public QueryBuilder<Vertex> 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<E> extends QueryBuilder<E> { return (QueryBuilder<Vertex>) this; } - - - /** * @{inheritDoc} */ @Override public QueryBuilder<Vertex> getChildVerticesFromParent(String parentKey, String parentValue, String childType) { - //TODO + // TODO return (QueryBuilder<Vertex>) this; } @@ -312,7 +310,8 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { * @{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<E> extends QueryBuilder<E> { } @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<E> extends QueryBuilder<E> { * @{inheritDoc} */ @Override - public QueryBuilder<Vertex> createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, List<String> labels) throws AAIException { + public QueryBuilder<Vertex> createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, + List<String> labels) throws AAIException { String parentName = out.getDbName(); String childName = in.getDbName(); if (out.isContainer()) { @@ -358,13 +359,14 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { return (QueryBuilder<Vertex>) this; } - - public QueryBuilder<Edge> getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, List<String> labels) throws AAIException { + public QueryBuilder<Edge> getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, + List<String> labels) throws AAIException { this.edgeQuery(type, outNodeType, inNodeType, labels); - return (QueryBuilder<Edge>)this; + return (QueryBuilder<Edge>) this; } - private void edgeQueryToVertex(EdgeType type, String outType, String inType, List<String> labels) throws AAIException { + private void edgeQueryToVertex(EdgeType type, String outType, String inType, List<String> labels) + throws AAIException { this.edgeQueryToVertex(type, outType, inType, labels, false); } @@ -376,7 +378,8 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { * @throws NoEdgeRuleFoundException * @throws AAIException */ - private void edgeQueryToVertex(EdgeType type, String outType, String inType, List<String> labels, boolean isPrivateEdge) throws AAIException { + private void edgeQueryToVertex(EdgeType type, String outType, String inType, List<String> labels, + boolean isPrivateEdge) throws AAIException { markParentBoundary(); Multimap<String, EdgeRule> rules = ArrayListMultimap.create(); EdgeRuleQuery.Builder qB = new EdgeRuleQuery.Builder(outType, inType).edgeType(type).setPrivate(isPrivateEdge); @@ -402,26 +405,28 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { } 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<E> extends QueryBuilder<E> { } } - 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<E> limit(long amount) { list.add(".limit(" + amount + ")"); return this; } + /** * @{inheritDoc} */ @@ -540,7 +549,6 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { } list.addAll(traversals); - return this; } @@ -563,7 +571,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { @Override public QueryBuilder<E> store(String name) { - this.list.add(".store('"+ name + "')"); + this.list.add(".store('" + name + "')"); stepIndex++; return this; @@ -571,7 +579,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { @Override public QueryBuilder<E> cap(String name) { - this.list.add(".cap('"+ name + "')"); + this.list.add(".cap('" + name + "')"); stepIndex++; return this; @@ -603,7 +611,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { @Override public QueryBuilder<E> repeat(QueryBuilder<E> builder) { - this.list.add(".repeat(__" + builder.getQuery() + ")"); + this.list.add(".repeat(__" + builder.getQuery() + ")"); stepIndex++; return this; @@ -638,12 +646,12 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { this.list.add(".tree()"); stepIndex++; - return (QueryBuilder<Tree>)this; + return (QueryBuilder<Tree>) this; } @Override public QueryBuilder<E> by(String name) { - this.list.add(".by('"+ name + "')"); + this.list.add(".by('" + name + "')"); stepIndex++; return this; @@ -653,7 +661,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { * {@inheritDoc} */ @Override - public QueryBuilder<E> simplePath(){ + public QueryBuilder<E> simplePath() { this.list.add(".simplePath()"); stepIndex++; return this; @@ -663,10 +671,10 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { * {@inheritDoc} */ @Override - public QueryBuilder<Path> path(){ + public QueryBuilder<Path> path() { this.list.add(".path()"); stepIndex++; - return (QueryBuilder<Path>)this; + return (QueryBuilder<Path>) this; } @Override @@ -674,7 +682,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { this.list.add(".outE()"); stepIndex++; - return (QueryBuilder<Edge>)this; + return (QueryBuilder<Edge>) this; } @Override @@ -682,7 +690,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { this.list.add(".inE()"); stepIndex++; - return (QueryBuilder<Edge>)this; + return (QueryBuilder<Edge>) this; } @Override @@ -690,7 +698,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { this.list.add(".outV()"); stepIndex++; - return (QueryBuilder<Vertex>)this; + return (QueryBuilder<Vertex>) this; } @Override @@ -698,7 +706,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { this.list.add(".inV()"); stepIndex++; - return (QueryBuilder<Vertex>)this; + return (QueryBuilder<Vertex>) this; } @Override @@ -727,19 +735,20 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { @Override public QueryBuilder<E> select(String... names) { - String stepString = ".select('"; - for(int i = 0; i<names.length; i++) { - stepString = stepString + names[i] +"'"; - if(i!=(names.length-1)) { - stepString = stepString + ",'"; - } - } - stepString = stepString + ")"; - this.list.add(stepString); + String stepString = ".select('"; + for (int i = 0; i < names.length; i++) { + stepString = stepString + names[i] + "'"; + if (i != (names.length - 1)) { + stepString = stepString + ",'"; + } + } + stepString = stepString + ")"; + this.list.add(stepString); stepIndex++; return this; } + /** * @{inheritDoc} */ @@ -764,7 +773,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { sb.append(piece); } - return (T2)sb.toString(); + return (T2) sb.toString(); } /** @@ -810,6 +819,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { } this.completeTraversal = this.gremlinGroovy.executeTraversal(queryString, params); } + @Override public boolean hasNext() { if (this.completeTraversal == null) { @@ -825,7 +835,7 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { executeQuery(); } - return (E)this.completeTraversal.next(); + return (E) this.completeTraversal.next(); } @Override @@ -834,13 +844,13 @@ public abstract class GremlinQueryBuilder<E> extends QueryBuilder<E> { executeQuery(); } - return (List<E>)this.completeTraversal.toList(); + return (List<E>) this.completeTraversal.toList(); } protected QueryBuilder<Edge> has(String key, String value) { this.list.add(HAS + key + "','" + value + "')"); - return (QueryBuilder<Edge>)this; + return (QueryBuilder<Edge>) 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<E> extends GremlinQueryBuilder<E> { - - /** - * 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<String> traversal, Loader loader, GraphTraversalSource source, GremlinQueryBuilder<E> 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<String, String> queryParams) - throws UnsupportedEncodingException, AAIException { - return factory.buildURIParser(uri, queryParams); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryParser createQueryFromObjectName(String objName) { - return factory.buildObjectNameParser(objName); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> newInstance(Vertex start) { - return new GremlinTraversal<>(loader, source, start); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> newInstance() { - return new GremlinTraversal<>(loader, source); - } - - @Override - protected QueryBuilder<E> cloneQueryAtStep(int index) { - - int idx = index; - - if (idx == 0) { - idx = stepIndex; - } - - List<String> 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<String> traversal, Loader loader, GraphTraversalSource source, + GremlinQueryBuilder<E> 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<String, String> queryParams) + throws UnsupportedEncodingException, AAIException { + return factory.buildURIParser(uri, queryParams); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryParser createQueryFromObjectName(String objName) { + return factory.buildObjectNameParser(objName); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> newInstance(Vertex start) { + return new GremlinTraversal<>(loader, source, start); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> newInstance() { + return new GremlinTraversal<>(loader, source); + } + + @Override + protected QueryBuilder<E> cloneQueryAtStep(int index) { + + int idx = index; + + if (idx == 0) { + idx = stepIndex; + } + + List<String> 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<E> extends GremlinQueryBuilder<E> { - - /** - * 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<String> traversal, Loader loader, GraphTraversalSource source, GremlinQueryBuilder<E> 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<String, String> queryParams) - throws UnsupportedEncodingException, AAIException { - return factory.buildURIParser(uri, queryParams); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryParser createQueryFromObjectName(String objName) { - return factory.buildObjectNameParser(objName); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> newInstance() { - return new GremlinUnique<>(loader, source); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> newInstance(Vertex start) { - return new GremlinUnique<>(loader, source, start); - } - - @Override - protected QueryBuilder<E> cloneQueryAtStep(int index) { - - int idx = index; - - if (idx == 0) { - idx = stepIndex; - } - - List<String> 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<String> traversal, Loader loader, GraphTraversalSource source, + GremlinQueryBuilder<E> 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<String, String> queryParams) + throws UnsupportedEncodingException, AAIException { + return factory.buildURIParser(uri, queryParams); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryParser createQueryFromObjectName(String objName) { + return factory.buildObjectNameParser(objName); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> newInstance() { + return new GremlinUnique<>(loader, source); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> newInstance(Vertex start) { + return new GremlinUnique<>(loader, source, start); + } + + @Override + protected QueryBuilder<E> cloneQueryAtStep(int index) { + + int idx = index; + + if (idx == 0) { + idx = stepIndex; + } + + List<String> 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<E> implements Iterator<E> { - 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<E> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<E> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> getVerticesByProperty(String key, List<?> values); + /** * Gets the vertices that have this property key. * @@ -137,7 +141,7 @@ public abstract class QueryBuilder<E> implements Iterator<E> { * @return the vertices by property */ public abstract QueryBuilder<Vertex> getVerticesByProperty(String key); - + /** * Gets the vertices that do not have this property key. * @@ -147,482 +151,525 @@ public abstract class QueryBuilder<E> implements Iterator<E> { */ public abstract QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> getVerticesGreaterThanProperty(String key, Object value) ; + public abstract QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> getTypedVerticesByMap(String type, Map<String, String> map); - - /** - * Creates the DB query. - * - * @param obj the obj - * @return the query builder - */ - public QueryBuilder<Vertex> createDBQuery(Introspector obj) { - this.createKeyQuery(obj); - this.createContainerQuery(obj); - return (QueryBuilder<Vertex>) this; - } - - /** - * Creates the key query. - * - * @param obj the obj - * @return the query builder - */ - public abstract QueryBuilder<Vertex> createKeyQuery(Introspector obj); - - /** - * Creates the container query. - * - * @param obj the obj - * @return the query builder - */ - public abstract QueryBuilder<Vertex> createContainerQuery(Introspector obj); - - /** - * Creates the edge traversal. - * - * @param parent the parent - * @param child the child - * @return the query builder - */ - public abstract QueryBuilder<Vertex> createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) throws AAIException; - - public abstract QueryBuilder<Vertex> getVerticesByBooleanProperty(String key, Object value); - - public QueryBuilder<Vertex> getVerticesByBooleanProperty(String key, MissingOptionalParameter value) { - return (QueryBuilder<Vertex>) this; - } - /** - * Creates the private edge traversal. - * - * @param parent the parent - * @param child the child - * @return the query builder - */ - public abstract QueryBuilder<Vertex> 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<Vertex> createEdgeTraversal(EdgeType type, Vertex parent, Introspector child) throws AAIException { - String nodeType = parent.<String>property(AAIProperties.NODE_TYPE).orElse(null); - this.createEdgeTraversal(type, nodeType, child.getDbName()); - return (QueryBuilder<Vertex>) this; - } - - /** - * - * @param type - * @param outNodeType - * @param inNodeType - * @return - * @throws AAIException - */ - public QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> createEdgeTraversal(String outNodeType, String inNodeType) throws AAIException { - - Introspector out = loader.introspectorFromName(outNodeType); - Introspector in = loader.introspectorFromName(inNodeType); - - QueryBuilder<Vertex> cousinBuilder = null; - QueryBuilder<Vertex> treeBuilder = null; - QueryBuilder<Vertex> 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<Vertex> 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<Vertex> createEdgeTraversalWithLabels(EdgeType type, String outNodeType, String inNodeType, List<String> 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<Vertex> createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, List<String> labels) throws AAIException; - - /** - * - * @param type - * @param outNodeType - * @param inNodeType - * @return - * @throws AAIException - */ - public QueryBuilder<Edge> getEdgesBetween(EdgeType type, String outNodeType, String inNodeType) throws AAIException { - this.getEdgesBetweenWithLabels(type, outNodeType, inNodeType, null); - - return (QueryBuilder<Edge>)this; - - } - /** - * - * @param type - * @param outNodeType - * @param inNodeType - * @param labels - * @return - * @throws AAIException - */ - public abstract QueryBuilder<Edge> getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, List<String> 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<String, String> 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<E> getParentQuery(); - - /** - * Gets the query. - * - * @return the query - */ - public abstract <E2> E2 getQuery(); - - /** - * Form boundary. - */ - public abstract void markParentBoundary(); - - public abstract QueryBuilder<E> limit(long amount); - - /** - * New instance. - * - * @param start the start - * @return the query builder - */ - public abstract QueryBuilder<E> newInstance(Vertex start); - - /** - * New instance. - * - * @return the query builder - */ - public abstract QueryBuilder<E> 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<Vertex> exactMatchQuery(Introspector obj); - - /** - * lets you join any number of QueryBuilders - * <b>be careful about starting with a union it will not use indexes</b> - * @param builder - * @return - */ - public abstract QueryBuilder<E> union(QueryBuilder<E>... builder); - - public abstract QueryBuilder<E> where(QueryBuilder<E>... builder); - - public abstract QueryBuilder<E> or(QueryBuilder<E>... builder); - - public abstract QueryBuilder<E> store(String name); - public abstract QueryBuilder<E> cap(String name); - public abstract QueryBuilder<E> unfold(); - public abstract QueryBuilder<E> dedup(); - public abstract QueryBuilder<E> emit(); - public abstract QueryBuilder<E> repeat(QueryBuilder<E> builder); - public abstract QueryBuilder<Edge> outE(); - public abstract QueryBuilder<Edge> inE(); - public abstract QueryBuilder<Vertex> inV(); - public abstract QueryBuilder<Vertex> outV(); - public abstract QueryBuilder<E> not(QueryBuilder<E> builder); - public abstract QueryBuilder<E> as(String name); - public abstract QueryBuilder<E> select(String name); - public abstract QueryBuilder<E> select(String... names); - public abstract QueryBuilder<E> until(QueryBuilder<E> builder); - public abstract QueryBuilder<E> groupCount(); - public abstract QueryBuilder<E> by(String name); - public abstract QueryBuilder<E> both(); - public abstract QueryBuilder<Tree> 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<E> simplePath(); - - /** - * - * @return QueryBuilder with the path step appended to its traversal - */ - public abstract QueryBuilder<Path> path(); - - public abstract void markContainer(); - - public abstract QueryBuilder<E> getContainerQuery(); - - public abstract List<E> toList(); - - /** - * Used to skip step if there is an optional property missing. - * @param key - * @param value - * @return - */ - public QueryBuilder<Vertex> getVerticesByProperty(String key, MissingOptionalParameter value) { - return (QueryBuilder<Vertex>) this; - } - - /** - * TODO the edge direction is hardcoded here, make it more generic - * Returns the parent edge of the vertex - * @return - */ - public QueryBuilder<Edge> getParentEdge() { - this.outE().has(EdgeProperty.CONTAINS.toString(), AAIDirection.IN.toString()); - return (QueryBuilder<Edge>)this; - } - - /** - * TODO the edge direction is hardcoded here, make it more generic - * Returns the parent vertex of the vertex - * @return - */ - public QueryBuilder<Vertex> getParentVertex() { - this.getParentEdge().inV(); - return (QueryBuilder<Vertex>)this; - } - - protected abstract QueryBuilder<Edge> 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<Vertex> getVerticesByNumberProperty(String key, Object value) { - return getVerticesByProperty(key, value); - } + public abstract QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> getTypedVerticesByMap(String type, Map<String, String> map); + + /** + * Creates the DB query. + * + * @param obj the obj + * @return the query builder + */ + public QueryBuilder<Vertex> createDBQuery(Introspector obj) { + this.createKeyQuery(obj); + this.createContainerQuery(obj); + return (QueryBuilder<Vertex>) this; + } + + /** + * Creates the key query. + * + * @param obj the obj + * @return the query builder + */ + public abstract QueryBuilder<Vertex> createKeyQuery(Introspector obj); + + /** + * Creates the container query. + * + * @param obj the obj + * @return the query builder + */ + public abstract QueryBuilder<Vertex> createContainerQuery(Introspector obj); + + /** + * Creates the edge traversal. + * + * @param parent the parent + * @param child the child + * @return the query builder + */ + public abstract QueryBuilder<Vertex> createEdgeTraversal(EdgeType type, Introspector parent, Introspector child) + throws AAIException; + + public abstract QueryBuilder<Vertex> getVerticesByBooleanProperty(String key, Object value); + + public QueryBuilder<Vertex> getVerticesByBooleanProperty(String key, MissingOptionalParameter value) { + return (QueryBuilder<Vertex>) this; + } + + /** + * Creates the private edge traversal. + * + * @param parent the parent + * @param child the child + * @return the query builder + */ + public abstract QueryBuilder<Vertex> 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<Vertex> createEdgeTraversal(EdgeType type, Vertex parent, Introspector child) + throws AAIException { + String nodeType = parent.<String>property(AAIProperties.NODE_TYPE).orElse(null); + this.createEdgeTraversal(type, nodeType, child.getDbName()); + return (QueryBuilder<Vertex>) this; + } + + /** + * + * @param type + * @param outNodeType + * @param inNodeType + * @return + * @throws AAIException + */ + public QueryBuilder<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> createEdgeTraversal(String outNodeType, String inNodeType) throws AAIException { + + Introspector out = loader.introspectorFromName(outNodeType); + Introspector in = loader.introspectorFromName(inNodeType); + + QueryBuilder<Vertex> cousinBuilder = null; + QueryBuilder<Vertex> treeBuilder = null; + QueryBuilder<Vertex> 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<Vertex> 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<Vertex> createEdgeTraversalWithLabels(EdgeType type, String outNodeType, String inNodeType, + List<String> 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<Vertex> createEdgeTraversalWithLabels(EdgeType type, Introspector out, Introspector in, + List<String> labels) throws AAIException; + + /** + * + * @param type + * @param outNodeType + * @param inNodeType + * @return + * @throws AAIException + */ + public QueryBuilder<Edge> getEdgesBetween(EdgeType type, String outNodeType, String inNodeType) + throws AAIException { + this.getEdgesBetweenWithLabels(type, outNodeType, inNodeType, null); + + return (QueryBuilder<Edge>) this; + + } + + /** + * + * @param type + * @param outNodeType + * @param inNodeType + * @param labels + * @return + * @throws AAIException + */ + public abstract QueryBuilder<Edge> getEdgesBetweenWithLabels(EdgeType type, String outNodeType, String inNodeType, + List<String> 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<String, String> 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<E> getParentQuery(); + + /** + * Gets the query. + * + * @return the query + */ + public abstract <E2> E2 getQuery(); + + /** + * Form boundary. + */ + public abstract void markParentBoundary(); + + public abstract QueryBuilder<E> limit(long amount); + + /** + * New instance. + * + * @param start the start + * @return the query builder + */ + public abstract QueryBuilder<E> newInstance(Vertex start); + + /** + * New instance. + * + * @return the query builder + */ + public abstract QueryBuilder<E> 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<Vertex> exactMatchQuery(Introspector obj); + + /** + * lets you join any number of QueryBuilders + * <b>be careful about starting with a union it will not use indexes</b> + * + * @param builder + * @return + */ + public abstract QueryBuilder<E> union(QueryBuilder<E>... builder); + + public abstract QueryBuilder<E> where(QueryBuilder<E>... builder); + + public abstract QueryBuilder<E> or(QueryBuilder<E>... builder); + + public abstract QueryBuilder<E> store(String name); + + public abstract QueryBuilder<E> cap(String name); + + public abstract QueryBuilder<E> unfold(); + + public abstract QueryBuilder<E> dedup(); + + public abstract QueryBuilder<E> emit(); + + public abstract QueryBuilder<E> repeat(QueryBuilder<E> builder); + + public abstract QueryBuilder<Edge> outE(); + + public abstract QueryBuilder<Edge> inE(); + + public abstract QueryBuilder<Vertex> inV(); + + public abstract QueryBuilder<Vertex> outV(); + + public abstract QueryBuilder<E> not(QueryBuilder<E> builder); + + public abstract QueryBuilder<E> as(String name); + + public abstract QueryBuilder<E> select(String name); + + public abstract QueryBuilder<E> select(String... names); + + public abstract QueryBuilder<E> until(QueryBuilder<E> builder); + + public abstract QueryBuilder<E> groupCount(); + + public abstract QueryBuilder<E> by(String name); + + public abstract QueryBuilder<E> both(); + + public abstract QueryBuilder<Tree> 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<E> simplePath(); + + /** + * + * @return QueryBuilder with the path step appended to its traversal + */ + public abstract QueryBuilder<Path> path(); + + public abstract void markContainer(); + + public abstract QueryBuilder<E> getContainerQuery(); + + public abstract List<E> toList(); + + /** + * Used to skip step if there is an optional property missing. + * + * @param key + * @param value + * @return + */ + public QueryBuilder<Vertex> getVerticesByProperty(String key, MissingOptionalParameter value) { + return (QueryBuilder<Vertex>) this; + } + + /** + * TODO the edge direction is hardcoded here, make it more generic + * Returns the parent edge of the vertex + * + * @return + */ + public QueryBuilder<Edge> getParentEdge() { + this.outE().has(EdgeProperty.CONTAINS.toString(), AAIDirection.IN.toString()); + return (QueryBuilder<Edge>) this; + } + + /** + * TODO the edge direction is hardcoded here, make it more generic + * Returns the parent vertex of the vertex + * + * @return + */ + public QueryBuilder<Vertex> getParentVertex() { + this.getParentEdge().inV(); + return (QueryBuilder<Vertex>) this; + } + + protected abstract QueryBuilder<Edge> 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<Vertex> getVerticesByNumberProperty(String key, Object value) { + return getVerticesByProperty(key, value); + } public QueryBuilder<Vertex> getVerticesByNumberProperty(String key) { - return getVerticesByProperty(key); + return getVerticesByProperty(key); } - + public QueryBuilder<Vertex> 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<E> extends GraphTraversalBuilder<E> { - /** - * 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<Vertex, E> traversal, Loader loader, GraphTraversalSource source, GraphTraversalBuilder<E> 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<String, String> queryParams) - throws UnsupportedEncodingException, AAIException { - return factory.buildURIParser(uri, queryParams); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryParser createQueryFromObjectName(String objName) { - return factory.buildObjectNameParser(objName); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> newInstance(Vertex start) { - return new TraversalQuery<>(loader, source, start); - } - - /** - * @{inheritDoc} - */ - @Override - public QueryBuilder<E> newInstance() { - return new TraversalQuery<>(loader, source); - } - - @Override - protected QueryBuilder<E> cloneQueryAtStep(int index) { - GraphTraversal.Admin<Vertex, E> cloneAdmin = getCloneAdmin(index); - return new TraversalQuery<>(cloneAdmin, loader, source, this); - } - - protected GraphTraversal.Admin<Vertex, E> getCloneAdmin(int index) { - int idx = index; - - if (idx == 0) { - idx = stepIndex; - } - - GraphTraversal<Vertex, E> clone = this.traversal.asAdmin().clone(); - GraphTraversal.Admin<Vertex, E> cloneAdmin = clone.asAdmin(); - List<Step> steps = cloneAdmin.getSteps(); - - for (int i = steps.size()-1; i >= idx; i--) { - cloneAdmin.removeStep(i); - } - return cloneAdmin; - } - - @Override - protected QueryBuilder<E> removeQueryStepsBetween(int start, int end) { - GraphTraversal<Vertex, E> clone = this.traversal.asAdmin().clone(); - GraphTraversal.Admin<Vertex, E> 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<Vertex, E> traversal, Loader loader, GraphTraversalSource source, + GraphTraversalBuilder<E> 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<String, String> queryParams) + throws UnsupportedEncodingException, AAIException { + return factory.buildURIParser(uri, queryParams); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryParser createQueryFromObjectName(String objName) { + return factory.buildObjectNameParser(objName); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> newInstance(Vertex start) { + return new TraversalQuery<>(loader, source, start); + } + + /** + * @{inheritDoc} + */ + @Override + public QueryBuilder<E> newInstance() { + return new TraversalQuery<>(loader, source); + } + + @Override + protected QueryBuilder<E> cloneQueryAtStep(int index) { + GraphTraversal.Admin<Vertex, E> cloneAdmin = getCloneAdmin(index); + return new TraversalQuery<>(cloneAdmin, loader, source, this); + } + + protected GraphTraversal.Admin<Vertex, E> getCloneAdmin(int index) { + int idx = index; + + if (idx == 0) { + idx = stepIndex; + } + + GraphTraversal<Vertex, E> clone = this.traversal.asAdmin().clone(); + GraphTraversal.Admin<Vertex, E> cloneAdmin = clone.asAdmin(); + List<Step> steps = cloneAdmin.getSteps(); + + for (int i = steps.size() - 1; i >= idx; i--) { + cloneAdmin.removeStep(i); + } + return cloneAdmin; + } + + @Override + protected QueryBuilder<E> removeQueryStepsBetween(int start, int end) { + GraphTraversal<Vertex, E> clone = this.traversal.asAdmin().clone(); + GraphTraversal.Admin<Vertex, E> 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<E> extends TraversalQuery { - protected Map<Integer, String> 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<Integer, String> stepToAaiUri) { - super(traversal, loader, source, gtb); - optimize = gtb.optimize; - this.stepToAaiUri = stepToAaiUri; - } + protected Map<Integer, String> 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<Integer, String> stepToAaiUri) { + super(traversal, loader, source, gtb); + optimize = gtb.optimize; + this.stepToAaiUri = stepToAaiUri; + } - this.completeTraversal = (Traversal.Admin<Vertex, E>) admin; + @Override + protected void executeQuery() { - } + this.completeTraversal = this.traversal.asAdmin().clone(); - } + if (this.optimize) { + this.completeTraversal = this.pivotTraversal(this.completeTraversal); + } - private Traversal.Admin<Vertex,E> pivotTraversal(Traversal.Admin<Vertex, E> traversalAdmin) { + if (start == null) { + Traversal.Admin admin = source.V().asAdmin(); + TraversalHelper.insertTraversal(admin.getEndStep(), completeTraversal, admin); - List<Step> steps = traversalAdmin.getSteps(); + this.completeTraversal = (Traversal.Admin<Vertex, E>) admin; - Traversal.Admin<Vertex, E> 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<Vertex, E> pivotTraversal(Traversal.Admin<Vertex, E> traversalAdmin) { - //clean up traversal steps - for (int i = 0; i < steps.size(); i++) { - traversalAdminStart.removeStep(0); - } + List<Step> steps = traversalAdmin.getSteps(); - ((GraphTraversal<Vertex, E>)traversalAdminStart).has(AAIProperties.AAI_URI, stepToAaiUri.get(lastURIStepKey)); - for (int i = lastURIStepKey; i < steps.size(); i++) { - traversalAdminStart.addStep(steps.get(i)); - } + Traversal.Admin<Vertex, E> 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<Vertex> createKeyQuery(Introspector obj) { - super.createKeyQuery(obj); + int lastURIStepKey = getLastURIStepKey(); - if (shouldAddStepUri(obj)) { - Optional<String> 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<Vertex>) 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<Vertex, E>) 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<Vertex> createKeyQuery(Introspector obj) { + super.createKeyQuery(obj); - if (shouldOptimize && obj.getMetadata(ObjectMetadata.ABSTRACT) != null) { - shouldOptimize = false; - } - - return shouldOptimize; + if (shouldAddStepUri(obj)) { + Optional<String> 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<Vertex>) this; + } - } + private boolean shouldAddStepUri(Introspector obj) { + boolean shouldOptimize = optimize; - private Optional<String> 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<String> 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<Integer, String> 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<Integer, String> 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<E> cloneQueryAtStep(int index) { - GraphTraversal.Admin<Vertex, E> cloneAdmin = getCloneAdmin(index); - return new TraversalURIOptimizedQuery<>(cloneAdmin, loader, source, this, getStepToAaiUriWithoutStepGreaterThan(index)); - } + @Override + protected QueryBuilder<E> cloneQueryAtStep(int index) { + GraphTraversal.Admin<Vertex, E> 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<String> rawRequestContent; - - private final Optional<MarshallerProperties> 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<String> getRawRequestContent() { - return rawRequestContent; - } - - public Optional<MarshallerProperties> 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> marshallerProperties = Optional.empty(); - - private Optional<String> 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<MarshallerProperties> getMarshallerProperties() { - return marshallerProperties; - } - protected Optional<String> 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<String> rawRequestContent; + + private final Optional<MarshallerProperties> 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<String> getRawRequestContent() { + return rawRequestContent; + } + + public Optional<MarshallerProperties> 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> marshallerProperties = Optional.empty(); + + private Optional<String> 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<MarshallerProperties> getMarshallerProperties() { + return marshallerProperties; + } + + protected Optional<String> 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<Boolean, List<Pair<URI, Response>>> process(List<DBRequest> 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<Boolean, List<Pair<URI, Response>>> process(List<DBRequest> 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<Pair<URI, Response>> responses = new ArrayList<>(); - MultivaluedMap<String, String> 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<Vertex> vertTemp; - List<Vertex> 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<String> 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).<String>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<String, Introspector> 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<Vertex> 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<Vertex, Introspector> deleteObjects = new HashMap<>(); - Map<String, URI> uriMap = new HashMap<>(); - Map<String, HashMap<String, Introspector>> 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<URI, Response> 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<String> 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<URI, Response> 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<String> templateVars = new ArrayList<String>(); - 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<URI, Response> 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<MediaType> 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<Vertex> 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<Vertex> 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<AAIException, ArrayList<String>> exceptionList = new HashMap<AAIException, ArrayList<String>>(); - - StringBuilder keyString = new StringBuilder(); - - Set<String> resourceKeys = input.getKeys(); - for (String key : resourceKeys) { - keyString.append(key).append("=").append(input.getValue(key).toString()).append(" "); - } - - for (AAIResponseMessage msg : aaiExtMap.getPrecheckResponseMessages().getAAIResponseMessage()) { - ArrayList<String> templateVars = new ArrayList<>(); - - templateVars.add("PUT " + input.getDbName()); - templateVars.add(keyString.toString()); - List<String> 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 - * <p> - * - * Example: - * - * <blockquote> - * 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 - * - * </blockquote> - * - * @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<String> 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<String, Introspector> getRelatedObjects(DBSerializer serializer, QueryEngine queryEngine, Vertex v, Introspector obj, Loader loader) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, UnsupportedEncodingException, AAIException, URISyntaxException { - - HashMap<String, Introspector> 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<Vertex> 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<Vertex, Introspector> buildIntrospectorObjects(DBSerializer serializer, Iterable<Vertex> vertices) { - Map<Vertex, Introspector> 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<String, URI> buildURIMap(DBSerializer serializer, Map<Vertex, Introspector> introSpector) { - Map<String, URI> uriMap = new HashMap<>(); - for (Map.Entry<Vertex, Introspector> 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<String, HashMap<String, Introspector>> buildRelatedObjects(DBSerializer serializer, - QueryEngine queryEngine, Map<Vertex, Introspector> introSpector) { - - Map<String, HashMap<String, Introspector>> relatedObjectsMap = new HashMap<>(); - for (Map.Entry<Vertex, Introspector> entry : introSpector.entrySet()) { - try { - HashMap<String, Introspector> 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<Vertex, Introspector> deleteObjects, Map<String, URI> uriMap, - Map<String, HashMap<String, Introspector>> deleteRelatedObjects, String basePath) { - for (Map.Entry<Vertex, Introspector> 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<Object> getPaginatedVertexList(List<Object> vertexList) throws AAIException { - List<Object> 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<Boolean, List<Pair<URI, Response>>> process(List<DBRequest> 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<Boolean, List<Pair<URI, Response>>> process(List<DBRequest> 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<Pair<URI, Response>> responses = new ArrayList<>(); + MultivaluedMap<String, String> 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<Vertex> vertTemp; + List<Vertex> 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<String> 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).<String>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<String, Introspector> 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<Vertex> 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<Vertex, Introspector> deleteObjects = new HashMap<>(); + Map<String, URI> uriMap = new HashMap<>(); + Map<String, HashMap<String, Introspector>> 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<URI, Response> 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<String> 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<URI, Response> 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<String> templateVars = new ArrayList<String>(); + 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<URI, Response> 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<MediaType> 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<Vertex> 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<Vertex> 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<AAIException, ArrayList<String>> exceptionList = new HashMap<AAIException, ArrayList<String>>(); + + StringBuilder keyString = new StringBuilder(); + + Set<String> resourceKeys = input.getKeys(); + for (String key : resourceKeys) { + keyString.append(key).append("=").append(input.getValue(key).toString()).append(" "); + } + + for (AAIResponseMessage msg : aaiExtMap.getPrecheckResponseMessages().getAAIResponseMessage()) { + ArrayList<String> templateVars = new ArrayList<>(); + + templateVars.add("PUT " + input.getDbName()); + templateVars.add(keyString.toString()); + List<String> 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 + * <p> + * + * Example: + * + * <blockquote> + * 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 + * + * </blockquote> + * + * @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<String> 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<String, Introspector> getRelatedObjects(DBSerializer serializer, QueryEngine queryEngine, Vertex v, + Introspector obj, Loader loader) throws IllegalAccessException, IllegalArgumentException, + InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, + UnsupportedEncodingException, AAIException, URISyntaxException { + + HashMap<String, Introspector> 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<Vertex> 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<Vertex, Introspector> buildIntrospectorObjects(DBSerializer serializer, Iterable<Vertex> vertices) { + Map<Vertex, Introspector> 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<String, URI> buildURIMap(DBSerializer serializer, Map<Vertex, Introspector> introSpector) { + Map<String, URI> uriMap = new HashMap<>(); + for (Map.Entry<Vertex, Introspector> 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<String, HashMap<String, Introspector>> buildRelatedObjects(DBSerializer serializer, + QueryEngine queryEngine, Map<Vertex, Introspector> introSpector) { + + Map<String, HashMap<String, Introspector>> relatedObjectsMap = new HashMap<>(); + for (Map.Entry<Vertex, Introspector> entry : introSpector.entrySet()) { + try { + HashMap<String, Introspector> 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<Vertex, Introspector> deleteObjects, Map<String, URI> uriMap, + Map<String, HashMap<String, Introspector>> deleteRelatedObjects, String basePath) { + for (Map.Entry<Vertex, Introspector> 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<Object> getPaginatedVertexList(List<Object> vertexList) throws AAIException { + List<Object> 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<NotificationEvent> 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<String, Introspector> 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<Object> 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<NotificationEvent> getEvents() { - return this.events; - } - - + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(UEBNotification.class); + + private Loader currentVersionLoader = null; + protected List<NotificationEvent> 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<String, Introspector> 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<Object> 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<NotificationEvent> 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<String> 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<String> 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 <MediaType> 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<String> templateVars = new ArrayList<String>(); - 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<String> 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<String> 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<String> 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<MediaType> 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<String> templateVars = new ArrayList<String>(); + 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<String> 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<String, Integer> m = new HashMap<String, Integer>(); - 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<Response> 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<Response> 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<String, Integer> m = new HashMap<String, Integer>(); + 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<Response> 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<Response> 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<String, Object> parameters = new HashMap<>(); - parameters.put("value", 30000); - parameters.put("unit", new PropertyExpression(new ClassExpression(ClassHelper.make(TimeUnit.class)),"MILLISECONDS")); + public AAIAbstractGroovyShell() { + Map<String, Object> 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<String, Object> params); + /** + * + * @param engine + * @param traversal + * @param params + * @return result of graph traversal + */ + public abstract String executeTraversal(TransactionalGraphEngine engine, String traversal, + Map<String, Object> params); - /** - * @param traversal - * @param params - * @return result of graph traversal - */ - public abstract GraphTraversal<?, ?> executeTraversal (String traversal, Map<String, Object> params); + /** + * @param traversal + * @param params + * @return result of graph traversal + */ + public abstract GraphTraversal<?, ?> executeTraversal(String traversal, Map<String, Object> 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<String, Object> 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<String, Object> params) { - throw new UnsupportedOperationException(); - } + public GremlinGroovyShell() { + super(); + } + + /** + * {@inheritDoc} + */ + @Override + public GraphTraversal<?, ?> executeTraversal(String traversal, Map<String, Object> 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<String, Object> 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<String, Object> params) { - QueryBuilder<Vertex> 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<String, Object> params) { + QueryBuilder<Vertex> 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<String, Object> params) { - throw new UnsupportedOperationException(); - } + /** + * @throws UnsupportedOperationException + */ + @Override + public GraphTraversal<?, ?> executeTraversal(String traversal, Map<String, Object> 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<String, String> getQueryMap(URI uri) { + MultivaluedMap<String, String> 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<String> replaceTemplates(Introspector obj, String uriString, PropertyMetadata metadata, + boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { + String result = uriString; + final Map<String, String> propMap = URITools.findProperties(obj, uriString, metadata, replaceWithWildcard); + if (propMap.isEmpty()) { + return Optional.empty(); + } + for (Entry<String, String> 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<String, String> findProperties(Introspector obj, String uriString, PropertyMetadata metadata, + boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { + + final Map<String, String> result = new HashMap<>(); + final Set<String> 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<String, String> getQueryMap(URI uri) { - MultivaluedMap<String, String> 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<String> replaceTemplates(Introspector obj, String uriString, PropertyMetadata metadata, boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { - String result = uriString; - final Map<String, String> propMap = URITools.findProperties(obj, uriString, metadata, replaceWithWildcard); - if (propMap.isEmpty()) { - return Optional.empty(); - } - for (Entry<String, String> 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<String, String> findProperties(Introspector obj, String uriString, PropertyMetadata metadata, boolean replaceWithWildcard) throws AAIMissingRequiredPropertyException { - - final Map<String, String> result = new HashMap<>(); - final Set<String> 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<String> 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<Vertex> 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 <T> 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 <T> List<Vertex> processObject(Introspector obj, Vertex v, String requestContext) throws UnsupportedEncodingException, AAIException { + private <T> List<Vertex> processObject(Introspector obj, Vertex v, String requestContext) + throws UnsupportedEncodingException, AAIException { Set<String> properties = new LinkedHashSet<>(obj.getProperties()); properties.remove(AAIProperties.RESOURCE_VERSION); List<Vertex> 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<Object> relationships = (List<Object>) wrapped.getValue("relationship"); @@ -526,12 +537,13 @@ public class DBSerializer { List<Vertex> 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<Vertex, Vertex, String> 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<Vertex> items = p.getQuery().toList(); + // QueryParser p = this.engine.getQueryBuilder().createQueryFromURI(obj.getURI()); + // List<Vertex> items = p.getQuery().toList(); QueryBuilder<Vertex> 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.<String>property(AAIProperties.RESOURCE_VERSION).orElse(null), (String) dependentObj.getValue(AAIProperties.RESOURCE_VERSION), (String) dependentObj.getURI()); + this.verifyResourceVersion("update", dependentObj.getDbName(), + dependentVertex.<String>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.<String>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<Vertex> vertices, final Introspector obj, int depth, boolean nodeOnly, String cleanUp) throws UnsupportedEncodingException, AAIException { + public Introspector dbToObject(List<Vertex> 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<Vertex> 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<Vertex> seen, int depth, boolean nodeOnly, String cleanUp) throws AAIException, UnsupportedEncodingException { + private Introspector dbToObject(Introspector obj, Vertex v, Set<Vertex> 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<Vertex> itr = v.vertices(ruleDirection, rule.getLabel()); List<Vertex> verticesList = (List<Vertex>) 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.<String>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<String, Object> hashMap){ + private void copySimplePropertyFromHashMap(String property, Introspector obj, Map<String, Object> hashMap) { final Map<PropertyMetadata, String> 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<String, Object> convertVertexToHashMap(Introspector obj, Vertex v){ + public Map<String, Object> convertVertexToHashMap(Introspector obj, Vertex v) { long startTime = System.currentTimeMillis(); Set<String> 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<String, Object> 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<Vertex> 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<Object> 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<String> 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<PropertyMetadata, String> 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<Vertex> 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<Vertex, Edge> findEdgesBetween = null; if (EdgeType.TREE.equals(type)) { - GraphTraversal<Vertex,Vertex> findVertex = this.engine.asAdmin().getTraversalSource().V(bVertex); - if(edgeRule.getDirection().equals(Direction.IN)){ + GraphTraversal<Vertex, Vertex> 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<Edge> 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<Edge> getEdgesBetween(EdgeType type, Vertex aVertex, Vertex bVertex) { @@ -1466,19 +1492,11 @@ public class DBSerializer { GraphTraversal<Vertex, Edge> 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<Vertex, Edge> 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<Vertex, Edge> 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<Vertex> vertices){ + void delete(List<Vertex> 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<Vertex> deletableVertices, String resourceVersion, boolean enableResourceVersion) throws IllegalArgumentException, AAIException { + public void delete(Vertex v, List<Vertex> 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.<String>property(AAIProperties.NODE_TYPE).orElse(null); - if (enableResourceVersion && !this.verifyResourceVersion("delete", nodeType, vertex.<String>property(AAIProperties.RESOURCE_VERSION).orElse(null), resourceVersion, nodeType)) { + if (enableResourceVersion && !this.verifyResourceVersion("delete", nodeType, + vertex.<String>property(AAIProperties.RESOURCE_VERSION).orElse(null), resourceVersion, nodeType)) { } List<Vertex> vertices = new ArrayList<Vertex>(); 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<Object> 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<Object> 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<Vertex> seen, int depth, boolean nodeOnly, List<String> filterCousinNodes, List<String> filterParentNodes) throws AAIException, UnsupportedEncodingException { + // TODO - See if you can merge the 2 dbToObjectWithFilters + public Introspector dbToObjectWithFilters(Introspector obj, Vertex v, Set<Vertex> seen, int depth, boolean nodeOnly, + List<String> filterCousinNodes, List<String> 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.<String>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<Vertex> itr = v.vertices(ruleDirection, rule.getLabel()); List<Vertex> verticesList = (List<Vertex>) 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<String> filterNodes) throws UnsupportedEncodingException, AAIException { + private Introspector createFilteredRelationshipList(Vertex v, Introspector obj, String cleanUp, + List<String> filterNodes) throws UnsupportedEncodingException, AAIException { List<Vertex> allCousins = this.engine.getQueryEngine().findCousinVertices(v); Iterator<Vertex> cousinVertices = allCousins.stream().filter(item -> { @@ -2135,10 +2163,9 @@ public class DBSerializer { return filterNodes.parallelStream().anyMatch(node::contains); }).iterator(); - List<Vertex> cousins = (List<Vertex>) IteratorUtils.toList(cousinVertices); - //items.parallelStream().anyMatch(inputStr::contains) + // items.parallelStream().anyMatch(inputStr::contains) List<Object> 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<K, V> extends HashMap<K, V> { - 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.<String>property(AAIProperties.NODE_TYPE).orElse(null); - String bType = bVertex.<String>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<String> 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<String> 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<EdgeProperty, String> 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<EdgeProperty, String> 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<String> 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.<String>property(AAIProperties.NODE_TYPE).orElse(null); - String bVertexType = b.<String>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.<String>property(AAIProperties.NODE_TYPE).orElse(null); + String bType = bVertex.<String>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<String> 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<String> 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<EdgeProperty, String> 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<EdgeProperty, String> 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<String> 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.<String>property(AAIProperties.NODE_TYPE).orElse(null); + String bVertexType = b.<String>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<Vertex> 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<VertexProperty<Object>> 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<Object> getListProperty(Vertex v, String name) { - - List<Object> result = new ArrayList<>(); - - Iterator<VertexProperty<Object>> iterator = v.properties(name); - - while (iterator.hasNext()) { - result.add(iterator.next().value()); - } - - if (result.isEmpty()) { - result = null; - } - - return result; - - } - - @Override - public QueryBuilder<Vertex> getQueryBuilder() { - return getQueryBuilder(this.loader); - } - - @Override - public QueryBuilder<Vertex> 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<Vertex> getQueryBuilder(Vertex start) { - return getQueryBuilder(this.loader, start); - } - - public GraphTraversalSource getTraversalSource() { - return graph.traversal(); - } - - @Override - public QueryBuilder<Vertex> 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<Vertex> 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<VertexProperty<Object>> 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<Object> getListProperty(Vertex v, String name) { + + List<Object> result = new ArrayList<>(); + + Iterator<VertexProperty<Object>> iterator = v.properties(name); + + while (iterator.hasNext()) { + result.add(iterator.next().value()); + } + + if (result.isEmpty()) { + result = null; + } + + return result; + + } + + @Override + public QueryBuilder<Vertex> getQueryBuilder() { + return getQueryBuilder(this.loader); + } + + @Override + public QueryBuilder<Vertex> 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<Vertex> getQueryBuilder(Vertex start) { + return getQueryBuilder(this.loader, start); + } + + public GraphTraversalSource getTraversalSource() { + return graph.traversal(); + } + + @Override + public QueryBuilder<Vertex> 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<VertexProperty<Object>> 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<Object> getListProperty(Vertex v, String name) { - - List<Object> result = new ArrayList<Object>(); - - Iterator<VertexProperty<Object>> 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<VertexProperty<Object>> 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<Object> getListProperty(Vertex v, String name) { + + List<Object> result = new ArrayList<Object>(); + + Iterator<VertexProperty<Object>> 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<Vertex> 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<Object> 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<Vertex> getQueryBuilder() { - return getQueryBuilder(this.loader); - } - - public QueryBuilder<Vertex> getQueryBuilder(QueryStyle style) { - return getQueryBuilder(style, this.loader); - } - - public QueryBuilder<Vertex> getQueryBuilder(Loader loader) { - return getQueryBuilder(this.style, loader); - } - - public QueryBuilder<Vertex> 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<Vertex> getQueryBuilder(Vertex start) { - return getQueryBuilder(this.loader, start); - } - - public QueryBuilder<Vertex> getQueryBuilder(Loader loader, Vertex start) { - return getQueryBuilder(this.style, loader, start); - } - - public QueryBuilder<Vertex> 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<Vertex> 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<Object> 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<Vertex> getQueryBuilder() { + return getQueryBuilder(this.loader); + } + + public QueryBuilder<Vertex> getQueryBuilder(QueryStyle style) { + return getQueryBuilder(style, this.loader); + } + + public QueryBuilder<Vertex> getQueryBuilder(Loader loader) { + return getQueryBuilder(this.style, loader); + } + + public QueryBuilder<Vertex> 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<Vertex> getQueryBuilder(Vertex start) { + return getQueryBuilder(this.loader, start); + } + + public QueryBuilder<Vertex> getQueryBuilder(Loader loader, Vertex start) { + return getQueryBuilder(this.style, loader, start); + } + + public QueryBuilder<Vertex> 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<Vertex> findParents(Vertex start) { - try { - StopWatch.conditionalStart(); + /** + * {@inheritDoc} + */ + @Override + public List<Vertex> findParents(Vertex start) { + try { + StopWatch.conditionalStart(); - @SuppressWarnings("unchecked") - final GraphTraversal<Vertex, Vertex> 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<Vertex, Vertex> 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<Vertex> findParents(String[] uris) { try { StopWatch.conditionalStart(); - final GraphTraversal<Vertex, Vertex> pipe = this.g.V() - .has(AAIProperties.AAI_URI, P.within(uris)) - .order().by(AAIProperties.AAI_URI, Order.decr); + final GraphTraversal<Vertex, Vertex> 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<Vertex> findAllChildren(Vertex start) { - - @SuppressWarnings("unchecked") - GraphTraversal<Vertex, Vertex> 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<Vertex> findAllChildren(Vertex start) { - return pipe.toList(); + @SuppressWarnings("unchecked") + GraphTraversal<Vertex, Vertex> 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<Vertex> findChildrenOfType(Vertex start, String type) { - @SuppressWarnings("unchecked") - GraphTraversal<Vertex, Vertex> 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<Vertex> findChildrenOfType(Vertex start, String type) { + @SuppressWarnings("unchecked") + GraphTraversal<Vertex, Vertex> 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<Vertex> findChildren(Vertex start) { - @SuppressWarnings("unchecked") - GraphTraversal<Vertex, Vertex> pipe = this.g.V(start).union( - __.outE().has(CONTAINS.toString(), OUT.toString()), - __.inE().has(CONTAINS.toString(), IN.toString()) - ).otherV().dedup(); + /** + * {@inheritDoc} + */ + @Override + public List<Vertex> findChildren(Vertex start) { + @SuppressWarnings("unchecked") + GraphTraversal<Vertex, Vertex> 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<Vertex> findDeletable(Vertex start) { + /** + * {@inheritDoc} + */ + @Override + public List<Vertex> findDeletable(Vertex start) { try { StopWatch.conditionalStart(); @SuppressWarnings("unchecked") - GraphTraversal<Vertex, Vertex> 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<Vertex, Vertex> 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<Vertex, Vertex> 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<Vertex, Vertex> 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<Vertex> findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { - GraphTraversal<Vertex, Vertex> 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<Element> findSubGraph(Vertex start, int iterations, boolean nodeOnly) { - final GraphTraversal<Vertex, ?> 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<Vertex> findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { + GraphTraversal<Vertex, Vertex> 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<Edge> 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<String> objects = loader.getAllObjects().keySet(); - GraphTraversal<Vertex, Edge> 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<Element> findSubGraph(Vertex start, int iterations, boolean nodeOnly) { + final GraphTraversal<Vertex, ?> 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<Edge> 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<String> objects = loader.getAllObjects().keySet(); + GraphTraversal<Vertex, Edge> 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<Vertex> 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<Vertex> 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<Vertex, Vertex> 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<Vertex, Vertex> 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<Vertex> executeQuery(TransactionalGraph g, QueryBuilder query) { + * List<Vertex> 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<Vertex> executeParentQuery(TransactionalGraph g, QueryBuilder query) { + * List<Vertex> 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<Vertex> findParents(Vertex start) { + * GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline(start).as("x").inE() + * .has("isParent", true).outV().loop("x", new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { + * GremlinPipeline<Vertex, Long> pipe = new GremlinPipeline<>(argument.getObject()); + * return pipe.inE().has("isParent", true).count() == 1 || argument.getLoops() < 100; + * } + * + * }, new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { + * return true; + * } + * + * }); + * + * List<Vertex> results = pipe.toList(); + * results.add(0, start); + * return results; + * } + * + * @Override + * public List<Vertex> findChildren(Vertex start) { + * Set<Vertex> seen = new HashSet<>(); + * seen.add(start); + * GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline(start).as("x").outE().has("isParent", true).inV() + * .except(seen).store(seen).loop("x", new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { + * GremlinPipeline<Vertex, Long> pipe = new GremlinPipeline<>(argument.getObject()); + * return pipe.outE().has("isParent", true).count() >= 1 || argument.getLoops() < 100; + * } + * + * }, new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { + * return true; + * } + * + * }); + * + * List<Vertex> results = pipe.toList(); + * results.add(0, start); + * return results; + * } + * + * @Override + * public List<Vertex> findDeletable(Vertex start) { + * Set<Vertex> seen = new HashSet<>(); + * seen.add(start); + * GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>(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<LoopPipe.LoopBundle<Vertex>, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { + * GremlinPipeline<Vertex, Long> 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<LoopPipe.LoopBundle<Vertex>, Boolean>() { + * + * @Override + * public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { + * return true; + * } + * + * }); + * List<Vertex> results = pipe.toList(); + * results.add(0, start); + * + * return results; + * } + * + * private List<Vertex> process(GremlinPipeline start, GremlinPipeline pipe) { + * + * + * return start.add(pipe).cast(Vertex.class).toList(); + * } + * + * @Override + * public List<Vertex> findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { + * GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>(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<Vertex> 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<Vertex> executeQuery(TransactionalGraph g, QueryBuilder query) { - List<Vertex> 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<Vertex> executeParentQuery(TransactionalGraph g, QueryBuilder query) { - List<Vertex> 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<Vertex> findParents(Vertex start) { - GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline(start).as("x").inE() - .has("isParent", true).outV().loop("x", new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { - GremlinPipeline<Vertex, Long> pipe = new GremlinPipeline<>(argument.getObject()); - return pipe.inE().has("isParent", true).count() == 1 || argument.getLoops() < 100; - } - - }, new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { - return true; - } - - }); - - List<Vertex> results = pipe.toList(); - results.add(0, start); - return results; - } - - @Override - public List<Vertex> findChildren(Vertex start) { - Set<Vertex> seen = new HashSet<>(); - seen.add(start); - GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline(start).as("x").outE().has("isParent", true).inV() - .except(seen).store(seen).loop("x", new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { - GremlinPipeline<Vertex, Long> pipe = new GremlinPipeline<>(argument.getObject()); - return pipe.outE().has("isParent", true).count() >= 1 || argument.getLoops() < 100; - } - - }, new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { - return true; - } - - }); - - List<Vertex> results = pipe.toList(); - results.add(0, start); - return results; - } - - @Override - public List<Vertex> findDeletable(Vertex start) { - Set<Vertex> seen = new HashSet<>(); - seen.add(start); - GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>(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<LoopPipe.LoopBundle<Vertex>, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { - GremlinPipeline<Vertex, Long> 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<LoopPipe.LoopBundle<Vertex>, Boolean>() { - - @Override - public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { - return true; - } - - }); - List<Vertex> results = pipe.toList(); - results.add(0, start); - - return results; - } - - private List<Vertex> process(GremlinPipeline start, GremlinPipeline pipe) { - - - return start.add(pipe).cast(Vertex.class).toList(); - } - - @Override - public List<Vertex> findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { - GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>(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<Vertex> 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<Vertex> executeQuery(TransactionalGraph g, QueryBuilder query) { -// List<Vertex> 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<Vertex> executeParentQuery(TransactionalGraph g, QueryBuilder query) { -// -// List<Vertex> 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<Vertex> executeQuery(Vertex startVertex, String query) { -// -// return this.processGremlinQuery(startVertex, "_()" + query); -// -// } -// -// @Override -// public List<Vertex> findParents(Vertex start) { -// -// String findAllParents = ".as('x').inE.has('isParent', true).outV" -// + ".loop('x'){it.object.inE.has('isParent',true).count()==1}{true}"; -// -// List<Vertex> results = this.executeQuery(start, findAllParents); -// results.add(0, start); -// return results; -// -// } -// -// @Override -// public List<Vertex> findChildren(Vertex start) { -// String findAllChildren = ".as('x').outE.has('isParent', true).inV" -// + ".loop('x'){it.object.outE.has('isParent', true).count() >= 1}{true}"; -// -// List<Vertex> results = this.executeQuery(start, findAllChildren); -// results.add(0, start); -// return results; -// -// } -// -// @Override -// public List<Vertex> 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<Vertex> results = this.executeQuery(start, findAllChildren); -// results.add(0, start); -// return results; -// } -// private List<Vertex> processGremlinQuery(String query) { -// -// Pattern firstHasSet = Pattern.compile("^(\\.has\\(.*?\\))(\\.has\\(.*?\\))*(?!\\.has)"); -// Pattern p = Pattern.compile("\\.has\\('(.*?)',\\s?'(.*?)'\\)"); -// Matcher m = firstHasSet.matcher(query); -// List<Vertex> results = null; -// GremlinPipeline<Graph, Vertex> 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<Vertex> processGremlinQuery(Vertex startVertex, String query) { -// -// Pipe pipe = Gremlin.compile(query); -// pipe.setStarts(new SingleIterator<Vertex>(startVertex)); -// -// return (List<Vertex>)IteratorUtils.toList(pipe.iterator()); -// } -// private List<Vertex> processGremlinQuery(List<Vertex> list, String query) { -// -// Pipe pipe = Gremlin.compile(query); -// -// pipe.setStarts(list); -// -// return (List<Vertex>)IteratorUtils.toList(pipe.iterator()); -// } -// -// -// @Override -// public List<Vertex> 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<Vertex> 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<Vertex> executeQuery(TransactionalGraph g, QueryBuilder query) { +// List<Vertex> 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<Vertex> executeParentQuery(TransactionalGraph g, QueryBuilder query) { +// +// List<Vertex> 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<Vertex> executeQuery(Vertex startVertex, String query) { +// +// return this.processGremlinQuery(startVertex, "_()" + query); +// +// } +// +// @Override +// public List<Vertex> findParents(Vertex start) { +// +// String findAllParents = ".as('x').inE.has('isParent', true).outV" +// + ".loop('x'){it.object.inE.has('isParent',true).count()==1}{true}"; +// +// List<Vertex> results = this.executeQuery(start, findAllParents); +// results.add(0, start); +// return results; +// +// } +// +// @Override +// public List<Vertex> findChildren(Vertex start) { +// String findAllChildren = ".as('x').outE.has('isParent', true).inV" +// + ".loop('x'){it.object.outE.has('isParent', true).count() >= 1}{true}"; +// +// List<Vertex> results = this.executeQuery(start, findAllChildren); +// results.add(0, start); +// return results; +// +// } +// +// @Override +// public List<Vertex> 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<Vertex> results = this.executeQuery(start, findAllChildren); +// results.add(0, start); +// return results; +// } +// private List<Vertex> processGremlinQuery(String query) { +// +// Pattern firstHasSet = Pattern.compile("^(\\.has\\(.*?\\))(\\.has\\(.*?\\))*(?!\\.has)"); +// Pattern p = Pattern.compile("\\.has\\('(.*?)',\\s?'(.*?)'\\)"); +// Matcher m = firstHasSet.matcher(query); +// List<Vertex> results = null; +// GremlinPipeline<Graph, Vertex> 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<Vertex> processGremlinQuery(Vertex startVertex, String query) { +// +// Pipe pipe = Gremlin.compile(query); +// pipe.setStarts(new SingleIterator<Vertex>(startVertex)); +// +// return (List<Vertex>)IteratorUtils.toList(pipe.iterator()); +// } +// private List<Vertex> processGremlinQuery(List<Vertex> list, String query) { +// +// Pipe pipe = Gremlin.compile(query); +// +// pipe.setStarts(list); +// +// return (List<Vertex>)IteratorUtils.toList(pipe.iterator()); +// } +// +// +// @Override +// public List<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> 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<Vertex> findDeletable(Vertex start); + public abstract List<Vertex> 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<Vertex> 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<Vertex> findDeletable(List<Vertex> 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<Element> 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<Element> 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<Vertex> 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<Edge> 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<Vertex> 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<Element> 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<Element> 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<Vertex> 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<Edge> 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<Vertex> 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<JsonObject> 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<JsonObject> 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<JsonObject> formatObject(Object o) throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported { - @SuppressWarnings("unchecked") - List<Object> list = (List<Object>) 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<Pair<String, Long>> getCount(Object o){ - - Pair<String, Long> 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.<Pair<String, Long>>empty(); - } - - return Optional.<Pair<String, Long>>of(pair); - } + @Override + public Optional<JsonObject> formatObject(Object o) + throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported { + @SuppressWarnings("unchecked") + List<Object> list = (List<Object>) 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<Pair<String, Long>> getCount(Object o) { + + Pair<String, Long> 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.<Pair<String, Long>>empty(); + } + + return Optional.<Pair<String, Long>>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<String, String>()); + } - 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<String, String>()); - } - - public Formatter get(Format format, MultivaluedMap<String, String> params) throws AAIException { - - Formatter formatter = null; + public Formatter get(Format format, MultivaluedMap<String, String> 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> T inject(T obj, MultivaluedMap<String, String> params) throws QueryParamInjectionException { + + injector.injectParams(obj, params); + return obj; + } - } - - return formatter; - } - - private <T> T inject (T obj, MultivaluedMap<String, String> 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<JsonObject> formatObject(Object o) throws AAIFormatVertexException, AAIFormatQueryResultFormatNotSupported; - - int parallelThreshold(); + Optional<JsonObject> 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<Object> queryResults) { - - Stream<Object> 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.<JsonObject>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<Object> queryResults) { + + Stream<Object> 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.<JsonObject>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<JsonObject> 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<String, JsonElement> outEntry = (Map.Entry<String, JsonElement>) 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<JsonObject> 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<String, JsonElement> outEntry = (Map.Entry<String, JsonElement>) 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<JsonObject> 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<JsonObject> 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<JsonObject> 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<JsonObject> getJsonFromVertex(Vertex input) throws AAIFormatVertexException; - - protected Optional<JsonObject> getJsonFromPath(Path input) throws AAIFormatVertexException { - List<Object> 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<JsonObject> 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<JsonObject> 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<JsonObject> getJsonFromVertex(Vertex input) throws AAIFormatVertexException; + + protected Optional<JsonObject> getJsonFromPath(Path input) throws AAIFormatVertexException { + List<Object> 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<JsonObject> 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<JsonObject> getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + @Override + protected Optional<JsonObject> 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<JsonObject> createPropertiesObject(Vertex v) throws AAIFormatVertexException { - JsonObject json = new JsonObject(); - Iterator<VertexProperty<Object>> iter = v.properties(); - - while (iter.hasNext()) { - VertexProperty<Object> 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<Edge> inIter = v.edges(Direction.IN); - Iterator<Edge> 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.<String>value(AAIProperties.NODE_TYPE)); - json.addProperty("url", this.urlBuilder.pathed(related)); - - return json; - } - - public static class Builder implements NodesOnly<Builder>, Depth<Builder> { - - 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<JsonObject> getJsonFromVertex(Vertex v) throws AAIFormatVertexException { - - JsonObject json = new JsonObject(); - json.addProperty("id", v.id().toString()); - json.addProperty("node-type", v.<String>value(AAIProperties.NODE_TYPE)); - json.addProperty("url", this.urlBuilder.pathed(v)); - Optional<JsonObject> 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<JsonObject> createPropertiesObject(Vertex v) throws AAIFormatVertexException { + JsonObject json = new JsonObject(); + Iterator<VertexProperty<Object>> iter = v.properties(); + + while (iter.hasNext()) { + VertexProperty<Object> 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<Edge> inIter = v.edges(Direction.IN); + Iterator<Edge> 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.<String>value(AAIProperties.NODE_TYPE)); + json.addProperty("url", this.urlBuilder.pathed(related)); + + return json; + } + + public static class Builder implements NodesOnly<Builder>, Depth<Builder> { + + 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<JsonObject> getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + + JsonObject json = new JsonObject(); + json.addProperty("id", v.id().toString()); + json.addProperty("node-type", v.<String>value(AAIProperties.NODE_TYPE)); + json.addProperty("url", this.urlBuilder.pathed(v)); + Optional<JsonObject> 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<JsonObject> getJsonFromVertex(Vertex v) throws AAIFormatVertexException { - - JsonObject json = new JsonObject(); - - if (this.includeUrl) { - json.addProperty("url", this.urlBuilder.pathed(v)); - } - Optional<JsonObject> jsonObject = this.vertexToJsonObject(v); - if (jsonObject.isPresent()) { - json.add(v.<String>property(AAIProperties.NODE_TYPE).orElse(null), jsonObject.get()); - } else { - return Optional.empty(); - } - return Optional.of(json); - } - - protected Optional<JsonObject> vertexToJsonObject(Vertex v) throws AAIFormatVertexException { - try { - final Introspector obj = getLoader().introspectorFromName( - v.<String>property(AAIProperties.NODE_TYPE) - .orElse(null) - ); - - final List<Vertex> 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<Builder>, Depth<Builder> { - - 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<JsonObject> getJsonFromVertex(Vertex v) throws AAIFormatVertexException { + + JsonObject json = new JsonObject(); + + if (this.includeUrl) { + json.addProperty("url", this.urlBuilder.pathed(v)); + } + Optional<JsonObject> jsonObject = this.vertexToJsonObject(v); + if (jsonObject.isPresent()) { + json.add(v.<String>property(AAIProperties.NODE_TYPE).orElse(null), jsonObject.get()); + } else { + return Optional.empty(); + } + return Optional.of(json); + } + + protected Optional<JsonObject> vertexToJsonObject(Vertex v) throws AAIFormatVertexException { + try { + final Introspector obj = + getLoader().introspectorFromName(v.<String>property(AAIProperties.NODE_TYPE).orElse(null)); + + final List<Vertex> 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<Builder>, Depth<Builder> { + + 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<JsonObject> 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<JsonObject> createPropertiesObject(Vertex v) throws AAIFormatVertexException { + try { + final Introspector obj = + loader.introspectorFromName(v.<String>property(AAIProperties.NODE_TYPE).orElse(null)); + + final List<Vertex> 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<JsonObject> createPropertiesObject(Vertex v) throws AAIFormatVertexException { - try { - final Introspector obj = loader.introspectorFromName( - v.<String>property(AAIProperties.NODE_TYPE) - .orElse(null) - ); - - final List<Vertex> 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<T> { - @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<T> { - @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<Class<?>> 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> T injectParams(T obj, MultivaluedMap<String, String> 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<Class<?>> 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> T injectParams(T obj, MultivaluedMap<String, String> 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<Vertex> bothVertices() { - return this.vertices(Direction.BOTH); - } - - @Override - public Iterator<Vertex> 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<Vertex> bothVertices() { + return this.vertices(Direction.BOTH); + } - + @Override + public Iterator<Vertex> 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<Element> tree; - private final Vertex self; - public TreeBackedVertex (Vertex v, Tree<Element> tree) { - super(v, true); - this.self = v; - this.tree = tree; - } - - @Override + private static final long serialVersionUID = -976854460992756953L; + private final Tree<Element> tree; + private final Vertex self; + + public TreeBackedVertex(Vertex v, Tree<Element> tree) { + super(v, true); + this.self = v; + this.tree = tree; + } + + @Override public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) { - final List<Element> edges = tree.getObjectsAtDepth(2); - final List<Tree<Element>> trees = tree.getTreesAtDepth(2); - final List<Tree<Element>> 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<Element> eTree = new Tree<>(); - for (Tree<Element> 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<Element> edges = tree.getObjectsAtDepth(2); + final List<Tree<Element>> trees = tree.getTreesAtDepth(2); + final List<Tree<Element>> 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<Element> eTree = new Tree<>(); + for (Tree<Element> 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<Tree<Element>> trees) { + Tree<Element> vTree = new Tree<>(); + for (Tree<Element> 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<Tree<Element>> trees) { - Tree<Element> vTree = new Tree<>(); - for (Tree<Element> tree : trees) { - if (tree.keySet().contains(v)) { - vTree = tree; - break; - } - } - - return new TreeBackedVertex((Vertex)vTree.keySet().iterator().next(), vTree); - } + @Override public Iterator<Vertex> vertices(final Direction direction, final String... labels) { - final List<Tree<Element>> vertexElements = tree.getTreesAtDepth(3); - final List<Element> 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<Vertex> 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<Vertex> itr = e.bothVertices(); - while (itr.hasNext()) { - list.add(itr.next()); - } - } - return list; - - }).flatMap(list -> list.stream()).map(v -> { - Tree<Element> vTree = new Tree<Element>(); - for (Tree<Element> tree : vertexElements) { - if (tree.keySet().contains(v)) { - vTree = tree; - break; - } - } - - return (Vertex)new TreeBackedVertex(v, vTree); - }).iterator(); - } - + final List<Tree<Element>> vertexElements = tree.getTreesAtDepth(3); + final List<Element> 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<Vertex> 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<Vertex> itr = e.bothVertices(); + while (itr.hasNext()) { + list.add(itr.next()); + } + } + return list; + + }).flatMap(list -> list.stream()).map(v -> { + Tree<Element> vTree = new Tree<Element>(); + for (Tree<Element> 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<KeyValueList> 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> 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<Entity> getEntity() { @@ -59,7 +61,7 @@ public class EntityList { /** * * @param entity - * The entity + * The entity */ @JsonProperty("entity") public void setEntity(List<Entity> 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 <T> 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 <T> List<KeyValueList> getKeyValueList(Entity e, T clazz) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - List<KeyValueList> 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 <T> 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 <T> String getJsonFromObject(T clazz) throws JsonGenerationException, JsonMappingException, IOException { - return getJsonFromObject(clazz, false, true); - } - - /** - * Gets the json from object. - * - * @param <T> 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 <T> 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 <T> the generic type - * @param clazz the clazz - * @return the xml from object - * @throws JAXBException the JAXB exception - * @throws IOException - */ - public <T> 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<String,Object> lookupHash, Collection<String> keyProps) { - int baseKeyLen = baseKey.length(); - StringBuffer newKey = new StringBuffer(); - if (baseKeyLen > 0) { - newKey.append(baseKey); - } - - Iterator <String> 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<String,HashMap<String,Object>> lookupHashes, Multimap<String, String> _dbRulesNodeKeyProps) { - Iterator<String> it = lookupHashes.keySet().iterator(); - String lookupKeys = ""; - while (it.hasNext()) { - String objectType = (String)it.next(); - HashMap<String,Object> lookupHash = lookupHashes.get(objectType); - - Collection<String> keyProps = _dbRulesNodeKeyProps.get(objectType); - Iterator <String> keyPropI = keyProps.iterator(); - while( keyPropI.hasNext() ){ - lookupKeys += lookupHash.get(keyPropI.next()); - } - } - return lookupKeys; - } - - /** - * Gets the example object. - * - * @param <T> 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 <T> 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<String> exampleList = new ArrayList<String>(); - 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 <T> 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 <T> List<KeyValueList> getKeyValueList(Entity e, T clazz) + throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + List<KeyValueList> 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 <T> 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 <T> String getJsonFromObject(T clazz) throws JsonGenerationException, JsonMappingException, IOException { + return getJsonFromObject(clazz, false, true); + } + + /** + * Gets the json from object. + * + * @param <T> 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 <T> 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 <T> the generic type + * @param clazz the clazz + * @return the xml from object + * @throws JAXBException the JAXB exception + * @throws IOException + */ + public <T> 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<String, Object> lookupHash, Collection<String> keyProps) { + int baseKeyLen = baseKey.length(); + StringBuffer newKey = new StringBuffer(); + if (baseKeyLen > 0) { + newKey.append(baseKey); + } + + Iterator<String> 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<String, HashMap<String, Object>> lookupHashes, + Multimap<String, String> _dbRulesNodeKeyProps) { + Iterator<String> it = lookupHashes.keySet().iterator(); + String lookupKeys = ""; + while (it.hasNext()) { + String objectType = (String) it.next(); + HashMap<String, Object> lookupHash = lookupHashes.get(objectType); + + Collection<String> keyProps = _dbRulesNodeKeyProps.get(objectType); + Iterator<String> keyPropI = keyProps.iterator(); + while (keyPropI.hasNext()) { + lookupKeys += lookupHash.get(keyPropI.next()); + } + } + return lookupKeys; + } + + /** + * Gets the example object. + * + * @param <T> 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 <T> 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<String> exampleList = new ArrayList<String>(); + 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<T> { - public static final String V14 = "v14"; - public final String fromAppId; - public final String transactionId; - public final String path; - public final RestObject<T> restObj; - public final boolean oldServer; - public final String apiVersion; - - - /** - * Instantiates a new request. - * - * @param builder the builder - */ - public Request(RequestBuilder<T> 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<T> { - private String fromAppId; - private String transactionId; - private String path; - private RestObject<T> 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<T> setFromAppId(String fromAppId) { - this.fromAppId = fromAppId; - return this; - } - - /** - * Sets the transaction id. - * - * @param transactionId the transaction id - * @return the request builder - */ - public RequestBuilder<T> setTransactionId(String transactionId) { - this.transactionId = transactionId; - return this; - - } - - /** - * Sets the path. - * - * @param path the path - * @return the request builder - */ - public RequestBuilder<T> setPath(String path) { - - this.path = path; - return this; - - } - - /** - * Sets the restcore obj. - * - * @param restObj the restcore obj - * @return the request builder - */ - public RequestBuilder<T> setRestObj(RestObject<T> restObj) { - this.restObj = restObj; - return this; - - } - - /** - * Sets the old server. - * - * @param oldServer the old server - * @return the request builder - */ - public RequestBuilder<T> setOldServer(boolean oldServer) { - this.oldServer = oldServer; - return this; - - } - - /** - * Sets the api version. - * - * @param apiVersion the api version - * @return the request builder - */ - public RequestBuilder<T> setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - return this; - } - - /** - * Builds the. - * - * @return the request - */ - public Request<T> build() { - return new Request<T>(this); - } - - } - + public static final String V14 = "v14"; + public final String fromAppId; + public final String transactionId; + public final String path; + public final RestObject<T> restObj; + public final boolean oldServer; + public final String apiVersion; + + /** + * Instantiates a new request. + * + * @param builder the builder + */ + public Request(RequestBuilder<T> 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<T> { + private String fromAppId; + private String transactionId; + private String path; + private RestObject<T> 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<T> setFromAppId(String fromAppId) { + this.fromAppId = fromAppId; + return this; + } + + /** + * Sets the transaction id. + * + * @param transactionId the transaction id + * @return the request builder + */ + public RequestBuilder<T> setTransactionId(String transactionId) { + this.transactionId = transactionId; + return this; + + } + + /** + * Sets the path. + * + * @param path the path + * @return the request builder + */ + public RequestBuilder<T> setPath(String path) { + + this.path = path; + return this; + + } + + /** + * Sets the restcore obj. + * + * @param restObj the restcore obj + * @return the request builder + */ + public RequestBuilder<T> setRestObj(RestObject<T> restObj) { + this.restObj = restObj; + return this; + + } + + /** + * Sets the old server. + * + * @param oldServer the old server + * @return the request builder + */ + public RequestBuilder<T> setOldServer(boolean oldServer) { + this.oldServer = oldServer; + return this; + + } + + /** + * Sets the api version. + * + * @param apiVersion the api version + * @return the request builder + */ + public RequestBuilder<T> setApiVersion(String apiVersion) { + this.apiVersion = apiVersion; + return this; + } + + /** + * Builds the. + * + * @return the request + */ + public Request<T> build() { + return new Request<T>(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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> 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 <T> 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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> 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 <T> 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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> 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 <T> the generic type - * @param typeDef the type def - * @param json the json - * @param clazz the clazz - * @return the list - * @throws Exception the exception - */ - private <T> List<T> mapJsonToObjectList(T typeDef,String json, Class clazz) throws Exception - { - List<T> 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 <T> 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 <T> void Put(T t, String sourceID, String transId, String path) throws AAIException { - Put( t, sourceID, transId, path, false, AAIConstants.AAI_RESOURCES_PORT); - } - - /** - * Put. - * - * @param <T> 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 <T> 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 <T> 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 <T> 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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> 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 <T> 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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> 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 <T> 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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> 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 <T> the generic type + * @param typeDef the type def + * @param json the json + * @param clazz the clazz + * @return the list + * @throws Exception the exception + */ + private <T> List<T> mapJsonToObjectList(T typeDef, String json, Class clazz) throws Exception { + List<T> 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 <T> 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 <T> void Put(T t, String sourceID, String transId, String path) throws AAIException { + Put(t, sourceID, transId, path, false, AAIConstants.AAI_RESOURCES_PORT); + } + + /** + * Put. + * + * @param <T> 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 <T> 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 <T> 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 <T> 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 <T> 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 <T> 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 <T> String Post(T t, String sourceID, String transId, String path, String apiVersion) throws Exception { + public <T> 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> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException - { - return clazz.newInstance(); - } - + public <T> T getInstance(Class<T> 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/" + <encoded-link-name>, resourceClassName, fromAppId, transId); - */ - public <T> T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId) { - - try { - - RestObject<T> restObj = new RestObject<T>(); - @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 <T> the generic type - * @param sourceID the source ID - * @param transId the trans id - * @param path the path - * @throws AAIException the AAI exception - */ - public <T> 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/" + <encoded-link-name>, + * resourceClassName, fromAppId, transId); + */ + public <T> T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId) { + + try { + + RestObject<T> restObj = new RestObject<T>(); + @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 <T> the generic type + * @param sourceID the source ID + * @param transId the trans id + * @param path the path + * @throws AAIException the AAI exception + */ + public <T> 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 <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> restObject, boolean oldserver) throws AAIException; + public <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> restObject, boolean oldserver) + throws AAIException; - public <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> restObject, String apiVersion) throws AAIException; + public <T> void Get(T t, String sourceID, String transId, String path, RestObject<T> restObject, String apiVersion) + throws AAIException; public <T> void Patch(T t, String sourceID, String transId, String path) throws AAIException; @@ -39,5 +41,5 @@ public interface RestControllerInterface { public <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException; - public <T> T DoesResourceExist(String resourcePath, String resourceClassName, String fromAppId, String transId) ; -}
\ No newline at end of file + public <T> 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<T> { - /** - * Generic version of the RestObject class. - * @param <T> the type of the value being called for the Rest object interface - */ + /** + * Generic version of the RestObject class. + * + * @param <T> 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<T> { * * @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<String> 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<String> 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; + + } } |