aboutsummaryrefslogtreecommitdiffstats
path: root/ajsc-aai/src/main/java/org/openecomp/aai/dbmap/SearchGraph.java
diff options
context:
space:
mode:
Diffstat (limited to 'ajsc-aai/src/main/java/org/openecomp/aai/dbmap/SearchGraph.java')
-rw-r--r--ajsc-aai/src/main/java/org/openecomp/aai/dbmap/SearchGraph.java1475
1 files changed, 1475 insertions, 0 deletions
diff --git a/ajsc-aai/src/main/java/org/openecomp/aai/dbmap/SearchGraph.java b/ajsc-aai/src/main/java/org/openecomp/aai/dbmap/SearchGraph.java
new file mode 100644
index 0000000..1dde5b7
--- /dev/null
+++ b/ajsc-aai/src/main/java/org/openecomp/aai/dbmap/SearchGraph.java
@@ -0,0 +1,1475 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.openecomp.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.openecomp.aai.dbmap;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.xml.bind.JAXBException;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.eclipse.persistence.dynamic.DynamicEntity;
+import org.eclipse.persistence.dynamic.DynamicType;
+import org.eclipse.persistence.exceptions.DynamicException;
+import org.eclipse.persistence.jaxb.JAXBMarshaller;
+import org.eclipse.persistence.jaxb.JAXBUnmarshaller;
+import org.eclipse.persistence.jaxb.MarshallerProperties;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+import org.openecomp.aai.dbgen.DbMeth;
+import org.openecomp.aai.dbgen.ModelBasedProcessing;
+import org.openecomp.aai.dbgen.ResultSet;
+import org.openecomp.aai.dbmodel.DbEdgeRules;
+import org.openecomp.aai.domain.model.AAIResource;
+import org.openecomp.aai.domain.model.AAIResourceKey;
+import org.openecomp.aai.domain.model.AAIResourceKeys;
+import org.openecomp.aai.domain.model.AAIResources;
+import org.openecomp.aai.exceptions.AAIException;
+import org.openecomp.aai.extensions.AAIExtensionMap;
+import org.openecomp.aai.ingestModel.DbMaps;
+import org.openecomp.aai.ingestModel.IngestModelMoxyOxm;
+import org.openecomp.aai.logging.AAILogger;
+import org.openecomp.aai.logging.LogLine;
+import org.openecomp.aai.util.AAIApiServerURLBase;
+import org.openecomp.aai.util.AAIApiVersion;
+import org.openecomp.aai.util.AAIConfig;
+import org.openecomp.aai.util.AAIConstants;
+import org.openecomp.aai.util.PojoUtils;
+import org.openecomp.aai.util.RestURL;
+import org.openecomp.aai.util.StoreNotificationEvent;
+
+import com.google.common.base.CaseFormat;
+import com.thinkaurelius.titan.core.TitanGraphQuery;
+import com.thinkaurelius.titan.core.TitanTransaction;
+import com.thinkaurelius.titan.core.TitanVertex;
+
+/**
+ * Database Mapping class which acts as the middle man between the REST interface objects
+ * for the Search namespace
+
+ */
+public class SearchGraph {
+
+ private LogLine logline = new LogLine();
+ private final String COMPONENT = "aaidbmap";
+ protected AAILogger aaiLogger = new AAILogger(SearchGraph.class.getName());
+
+
+ /**
+ * Get the search result based on the includeNodeType and depth provided.
+ *
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param startNodeType the start node type
+ * @param startNodeKeyParams the start node key params
+ * @param includeNodeTypes the include node types
+ * @param depth the depth
+ * @param aaiExtMap the aai ext map
+ * @return Response
+ * @throws AAIException the AAI exception
+ */
+ public Response runGenericQuery (String fromAppId,
+ String transId,
+ String startNodeType,
+ List <String> startNodeKeyParams,
+ List <String> includeNodeTypes,
+ final int depth,
+ AAIExtensionMap aaiExtMap) throws AAIException {
+ DynamicEntity searchResults = null;
+ Response response = null;
+ boolean success = true;
+ TitanTransaction g = null;
+ try {
+ g = AAIGraph.getInstance().getGraph().newTransaction();
+
+ logline.init(COMPONENT, transId, fromAppId, "runGenericQuery");
+
+ if( startNodeType == null ){
+ String emsg = "null start-node-type passed to the generic query\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ } else {
+ logline.add("start-node-type", startNodeType);
+ }
+
+ if( startNodeKeyParams == null ){
+ String emsg = "no key param passed to the generic query\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ } else {
+ logline.add("key", startNodeKeyParams.toString());
+ }
+
+ if( includeNodeTypes == null ){
+ String emsg = "no include params passed to the generic query\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ } else {
+ logline.add("include", includeNodeTypes.toString());
+ }
+
+ if (depth > 6) {
+ String emsg = "The maximum depth supported by the generic query is 6\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ } else {
+ logline.add("depth", depth);
+ }
+
+ // Build a hash with keys to uniquely identify the start Node
+ HashMap <String,Object> propHash = new HashMap<String, Object>();
+ String keyName = null, keyValue = null;
+
+ String keyNameString = "";
+ for( String keyData : startNodeKeyParams ){
+ int colonIndex = keyData.indexOf(":");
+ if( colonIndex <= 0 ){
+ String emsg = "Bad key param passed in: [" + keyData + "]\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ else {
+ keyName = keyData.substring(0, colonIndex);
+ keyValue = keyData.substring(colonIndex + 1);
+ propHash.put(keyName, keyValue);
+
+ keyNameString += keyName.toLowerCase() + "|";
+ }
+ }
+
+ // there is an issue with service-instance - it is a unique node but still dependent
+ // for now lets use getUniqueNode() to get the startNode if startNodeType is service-instance
+ TitanVertex startNode = null;
+ if (startNodeType.equalsIgnoreCase("service-instance")) {
+ Iterable <?> verts = g.query().has(keyName.substring(keyName.indexOf('.') + 1), keyValue).vertices();
+ Iterator <?> vertI = verts.iterator();
+ if( vertI != null && vertI.hasNext()) {
+ // We found a vertex that meets the input criteria.
+ startNode = (TitanVertex) vertI.next();
+
+ if( vertI.hasNext() ){
+ // Since this routine is looking for a unique node for the given input values, if
+ // more than one is found - it's a problem.
+ String detail = "More than one Node found by getUniqueNode for params: " + startNodeKeyParams.toString() + "\n";
+ throw new AAIException("AAI_6112", detail);
+ }
+ }
+ else {
+ // No Vertex was found for this key - throw a not-found exception
+ String msg = "No Node of type " + "service-instance" + " found for properties: " + startNodeKeyParams.toString();
+ logline.add("msg", msg);
+ throw new AAIException("AAI_6114", msg);
+ }
+
+ } else {
+ // Look for the start node based on the key params
+ startNode = DbMeth.getUniqueNodeWithDepParams(transId,
+ fromAppId,
+ g,
+ startNodeType,
+ propHash,
+ aaiExtMap.getApiVersion());
+ }
+ if( startNode == null ){
+ String emsg = "No Node of type " +
+ startNodeType +
+ " found for properties: " +
+ startNodeKeyParams.toString();
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6114", emsg);
+ }
+
+
+ Collection <Vertex> ver = new HashSet <Vertex> ();
+
+ if (includeNodeTypes.contains(startNodeType) || depth == 0 || includeNodeTypes.contains("all") )
+ ver.add(startNode);
+
+ if (depth != 0) {
+ // Now look for a node of includeNodeType within a given depth
+ startNode.graph().traversal().withSideEffect("x", ver).V(startNode)
+ .repeat(__.both().store("x")).times(depth).iterate();
+ }
+
+ if( ver.isEmpty()){
+ logline.add("msg", "No nodes found - apipe was null/empty");
+ }
+ else {
+ AAIResources aaiResources = org.openecomp.aai.ingestModel.IngestModelMoxyOxm.aaiResourceContainer
+ .get(aaiExtMap.getApiVersion());
+ DynamicJAXBContext jaxbContext = aaiResources.getJaxbContext();
+ if (aaiExtMap.getApiVersion().equals("v2")) {
+ searchResults = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.SearchResults");
+ } else {
+ searchResults = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." +
+ aaiExtMap.getApiVersion() +
+ ".SearchResults");
+ }
+ ArrayList <DynamicEntity> resultDataList = new ArrayList<DynamicEntity>();
+ for (Vertex thisNode: ver){
+ String nodeType = thisNode.<String>property("aai-node-type").orElse(null);
+ if (depth == 0 || includeNodeTypes.contains(nodeType) || includeNodeTypes.contains("all")) {
+ // DbMeth.showPropertiesForNode( transId, fromAppId, thisNode );
+ String thisNodeURL = RestURL.getSearchUrl(g, (TitanVertex)thisNode, aaiExtMap.getApiVersion());
+ DynamicEntity resultData = null;
+ if (aaiExtMap.getApiVersion().equals("v2")) {
+ resultData = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.ResultData");
+ } else {
+ resultData = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." +
+ aaiExtMap.getApiVersion() +
+ ".ResultData");
+ }
+
+ resultData.set("resourceType", nodeType);
+ resultData.set("resourceLink", thisNodeURL);
+ resultDataList.add(resultData);
+ }
+ }
+ searchResults.set("resultData", resultDataList);
+ response = getResponseFromDynamicEntity(searchResults, jaxbContext, aaiExtMap);
+
+ logline.add("msg", ver.size() + " node(s) traversed, " + resultDataList.size() + " found");
+ }
+ success = true;
+ } catch (AAIException e) {
+ success = false;
+ aaiLogger.info(logline, false, e.getErrorObject().getErrorCodeString());
+ throw e;
+ } catch (Exception e) {
+ success = false;
+ aaiLogger.info(logline, false, "AAI_5105");
+ throw new AAIException("AAI_5105", e);
+ } finally {
+ if (g != null) {
+ if (success) {
+ g.commit();
+ } else {
+ g.rollback();
+ }
+ }
+
+ }
+ aaiLogger.info(logline, true, "0");
+ return response;
+ }
+
+ /**
+ * Run nodes query.
+ *
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param targetNodeType the target node type
+ * @param edgeFilterParams the edge filter params
+ * @param filterParams the filter params
+ * @param aaiExtMap the aai ext map
+ * @return Response
+ * @throws AAIException the AAI exception
+ */
+ public Response runNodesQuery (String fromAppId,
+ String transId,
+ String targetNodeType,
+ List <String> edgeFilterParams,
+ List <String> filterParams,
+ AAIExtensionMap aaiExtMap) throws AAIException {
+
+ DynamicEntity searchResults = null;
+ Response response = null;
+ boolean success = true;
+ TitanTransaction g = null;
+ try {
+ g = AAIGraph.getInstance().getGraph().newTransaction();
+
+ logline.init(COMPONENT, transId, fromAppId, "runNodesQuery");
+
+ DbMaps dbMaps = IngestModelMoxyOxm.dbMapsContainer.get(AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP));
+ int resCount = 0;
+
+ if( targetNodeType == null || targetNodeType == "" ){
+ String emsg = "null or empty target-node-type passed to the node query\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ else {
+ logline.add("start-node-type", targetNodeType);
+ }
+
+ if( ! dbMaps.NodeProps.containsKey(targetNodeType) ){
+ String emsg = " Unrecognized nodeType [" + targetNodeType + "] passed to node query.\n";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6115", emsg);
+ }
+
+ if( filterParams.isEmpty() && edgeFilterParams.isEmpty()){
+ // For now, it's ok to pass no filter params. We'll just return ALL the nodes of the requested type.
+ String wmsg = "No filters passed to the node query\n";
+ logline.add("warn-msg", wmsg);
+ filterParams = new ArrayList <String>();
+ edgeFilterParams = new ArrayList <String>();
+ }
+ else {
+ if( !filterParams.isEmpty())
+ logline.add("filterParams", "[" + filterParams.toString() + "]");
+ if( !edgeFilterParams.isEmpty())
+ logline.add("edgeFilterParams", "[" + edgeFilterParams.toString() + "]");
+ }
+
+ Collection <TitanVertex> resultSetVertices = new ArrayList <TitanVertex> ();
+ String queryStringForMsg = "";
+ TitanGraphQuery tgQ = g.query().has("aai-node-type", targetNodeType);
+ queryStringForMsg = "has(\"aai-node-type\"," + targetNodeType + ")";
+
+ for( String filter : filterParams ) {
+ if( (tgQ != null) && (tgQ instanceof TitanGraphQuery) ){
+ String [] pieces = filter.split(":");
+ if( pieces.length < 2 ){
+ String emsg = "bad filter passed to node query: [" + filter + "]";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ else {
+ String propName = pieces[0];
+ String filterType = pieces[1];
+ if( filterType.equals("EQUALS")){
+ if( pieces.length != 3 ){
+ String emsg = "No value passed for filter: [" + filter + "]";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ else {
+ String value = pieces[2];
+ queryStringForMsg = queryStringForMsg + ".has(" + propName + "," + value + ")";
+ tgQ = tgQ.has(propName,value);
+ }
+ }
+ else if( filterType.equals("DOES-NOT-EQUAL")){
+ if( pieces.length != 3 ){
+ String emsg = "No value passed for filter: [" + filter + "]";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ else {
+ String value = pieces[2];
+ queryStringForMsg = queryStringForMsg + ".hasNot(" + propName + "," + value + ")";
+ tgQ = tgQ.hasNot(propName,value);
+ }
+ }
+ else if( filterType.equals("EXISTS")){
+ queryStringForMsg = queryStringForMsg + ".has(" + propName + ")";
+ tgQ = tgQ.has(propName);
+ }
+ else if( filterType.equals("DOES-NOT-EXIST")){
+ queryStringForMsg = queryStringForMsg + ".hasNot(" + propName + ")";
+ tgQ = tgQ.hasNot(propName);
+ }
+ else {
+ String emsg = "bad filterType passed: [" + filterType + "]";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ }
+ }
+ }
+ if( (tgQ != null) && (tgQ instanceof TitanGraphQuery) ){
+ Iterable <?> targetNodeIterable = (Iterable<TitanVertex>) tgQ.vertices();
+ Iterator <?> targetNodeIterator = targetNodeIterable.iterator();
+
+ if (!edgeFilterParams.isEmpty()) {
+ // edge-filter=pserver:EXISTS: OR pserver:EXISTS:hostname:XXX
+ // edge-filter=pserver:DOES-NOT-EXIST: OR pserver:DOES-NOT-EXIST:hostname:XXX
+ String filter = edgeFilterParams.get(0); // we process and allow only one edge filter for now
+ String [] pieces = filter.split(":");
+ if( pieces.length < 2 || pieces.length == 3 || pieces.length > 4){
+ String emsg = "bad edge-filter passed: [" + filter + "]";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ } else {
+ String nodeType = pieces[0].toLowerCase();
+ String filterType = pieces[1].toUpperCase();
+ if (!filterType.equals("EXISTS") && !filterType.equals("DOES-NOT-EXIST")) {
+ String emsg = "bad filterType passed: [" + filterType + "]";
+ logline.add("emsg", emsg);
+ throw new AAIException("AAI_6120", emsg);
+ }
+ String propName = null, propValue = null;
+ if( pieces.length >= 3) {
+ propName = pieces[2].toLowerCase();
+ propValue = pieces[3];
+ }
+ String edgeLabel = getEdgeLabel(targetNodeType, nodeType);
+ Iterator<Vertex> relatedToIterable = null;
+ while( targetNodeIterator.hasNext() ){
+ TitanVertex targetNodeVertex = (TitanVertex)targetNodeIterator.next();
+ relatedToIterable = targetNodeVertex.vertices(Direction.BOTH, edgeLabel);
+ Iterator <?> relatedToIterator = relatedToIterable;
+ if( filterType.equals("DOES-NOT-EXIST") && propName == null){
+ if (!relatedToIterator.hasNext()) {
+ resultSetVertices.add(targetNodeVertex);
+ }
+ } else {
+ while (relatedToIterator.hasNext()) {
+ TitanVertex relatedToVertex = (TitanVertex)relatedToIterator.next();
+ if (filterType.equals("EXISTS")) {
+ if (propName == null)
+ resultSetVertices.add(targetNodeVertex);
+ else {
+ // check for matching property
+ if (relatedToVertex.<String>property(propName).orElse(null) != null && relatedToVertex.<String>property(propName).equals(propValue))
+ resultSetVertices.add(targetNodeVertex);
+ }
+ } else if (filterType.equals("DOES-NOT-EXIST")) {
+ // check for matching property
+ if (relatedToVertex.<String>property(propName).orElse(null) != null && !relatedToVertex.<String>property(propName).equals(propValue))
+ resultSetVertices.add(targetNodeVertex);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ while( targetNodeIterator.hasNext() ){
+ TitanVertex targetNodeVertex = (TitanVertex)targetNodeIterator.next();
+ resultSetVertices.add(targetNodeVertex);
+ }
+ }
+
+ AAIResources aaiResources = org.openecomp.aai.ingestModel.IngestModelMoxyOxm.aaiResourceContainer
+ .get(aaiExtMap.getApiVersion());
+ DynamicJAXBContext jaxbContext = aaiResources.getJaxbContext();
+ if (aaiExtMap.getApiVersion().equals("v2")) {
+ searchResults = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.SearchResults");
+ } else {
+ searchResults = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." +
+ aaiExtMap.getApiVersion() +
+ ".SearchResults");
+ }
+ ArrayList <DynamicEntity> resultDataList = new ArrayList<DynamicEntity>();
+ for (TitanVertex thisNode: resultSetVertices){
+ resCount++;
+ String nodeType = thisNode.<String>property("aai-node-type").orElse(null);
+ String thisNodeURL = RestURL.getSearchUrl(g, thisNode, aaiExtMap.getApiVersion());
+ DynamicEntity resultData = null;
+ if (aaiExtMap.getApiVersion().equals("v2")) {
+ resultData = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.ResultData");
+
+ } else {
+ resultData = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." +
+ aaiExtMap.getApiVersion() + ".ResultData");
+ }
+ resultData.set("resourceType", nodeType);
+ resultData.set("resourceLink", thisNodeURL);
+ resultDataList.add(resultData);
+ }
+ searchResults.set("resultData", resultDataList);
+ response = getResponseFromDynamicEntity(searchResults, jaxbContext, aaiExtMap);
+ }
+ logline.add("count", resCount);
+ success = true;
+ } catch (AAIException e) {
+ success = false;
+ aaiLogger.info(logline, false, e.getErrorObject().getErrorCodeString());
+ throw e;
+ } catch (Exception e) {
+ success = false;
+ aaiLogger.info(logline, false, "AAI_5105");
+ throw new AAIException("AAI_5105", e);
+ } finally {
+ if (g != null) {
+ if (success) {
+ g.commit();
+ } else {
+ g.rollback();
+ }
+ }
+ }
+
+ aaiLogger.info(logline, true, "0");
+ return response;
+ }
+
+ /**
+ * Map result.
+ *
+ * @param g the g
+ * @param logline the logline
+ * @param jaxbContext the jaxb context
+ * @param aaiExtMap the aai ext map
+ * @param resultDetail the result detail
+ * @param includeNodeTypes the include node types
+ * @param resultSet the result set
+ * @param invItemCount the inv item count
+ * @param levelCount the level count
+ * @return the dynamic entity
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ * @throws AAIException the AAI exception
+ */
+ public DynamicEntity mapResult(TitanTransaction g, LogLine logline,
+ DynamicJAXBContext jaxbContext,
+ AAIExtensionMap aaiExtMap,
+ String resultDetail,
+ ArrayList<String> includeNodeTypes,
+ ResultSet resultSet,
+ int invItemCount,
+ int levelCount )
+ throws UnsupportedEncodingException, AAIException {
+
+ ArrayList <String> retArr = new ArrayList <String> ();
+ DynamicEntity item = null;
+
+ if (aaiExtMap.getApiVersion().equals("v2")) {
+ item = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.InventoryItem");
+ } else {
+ item = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryItem");
+ }
+
+ levelCount++;
+ TitanVertex node = resultSet.getVert();
+ if( node == null ){
+ retArr.add("null Node object returned");
+ }
+ else {
+ String nt = node.<String>property("aai-node-type").orElse(null);
+
+ if ((includeNodeTypes.contains("all")) ||
+ (includeNodeTypes.contains(nt.toLowerCase()))) { // include this node in resultSet only if its one of
+ // the included node types or its include "all"
+
+ retArr.add( levelCount + " " + nt + ", " + node.id().toString() + ";");
+ item.set("inventoryItemType", nt);
+
+ String thisNodeURL = node.<String>property("aai-unique-key").orElse(null);
+ String permanentURL = aaiExtMap.getUriInfo().getQueryParameters().getFirst("permanenturl");
+ if (thisNodeURL != null && !thisNodeURL.equals("")) {
+ thisNodeURL = AAIApiServerURLBase.get() + AAIApiVersion.get() + "/" + thisNodeURL;
+ } else if ("true".equals(permanentURL)) {
+ thisNodeURL = RestURL.getSearchUrl(g, node, aaiExtMap.getApiVersion());
+ }
+ else {
+ thisNodeURL = AAIApiServerURLBase.get() + AAIApiVersion.get() + "/resources/id/" + node.id();
+ }
+ item.set("inventoryItemLink", thisNodeURL);
+
+ DbMaps dbMaps = IngestModelMoxyOxm.dbMapsContainer.get(AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP));
+ Collection <String> indexProperties = dbMaps.NodeMapIndexedProps.get(nt);
+
+ ArrayList <DynamicEntity> itemDataList = new ArrayList<DynamicEntity>();
+
+ Iterator<VertexProperty<Object>> pI = node.properties();
+
+ ArrayList<String> defB = new ArrayList<String>();
+
+ if (AAIConfig.getDefaultBools().containsKey(nt)) {
+ for (String db : AAIConfig.getDefaultBools().get(nt)) {
+ defB.add(db);
+ }
+ }
+
+ while( pI.hasNext() ){
+ VertexProperty<Object> tp = pI.next();
+ String propKey = tp.key();
+ if (!propKey.equals("aai-node-type") &&
+ (!dbMaps.ReservedPropNames.containsKey((String)propKey)) && // do not return internal properties
+ ((resultDetail.equalsIgnoreCase("all") ||
+ ((resultDetail.equalsIgnoreCase("summary") && // only include indexed properties
+ // if summary detail required
+ indexProperties.contains(propKey))) ))){
+ if (defB.contains(propKey)) {
+ defB.remove(propKey);
+ }
+ DynamicEntity invItemData = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." +
+ aaiExtMap.getApiVersion() +
+ ".InventoryItemData");
+ invItemData.set("propertyName", tp.key());
+ String propVal = "";
+ if( tp.value() != null ){
+ propVal = tp.value().toString();
+ }
+ invItemData.set("propertyValue", propVal);
+ itemDataList.add(invItemData);
+ }
+ }
+
+ for (String db : defB) {
+ if ((resultDetail.equalsIgnoreCase("all") ||
+ ((resultDetail.equalsIgnoreCase("summary") && // only include indexed properties
+ // if summary detail required
+ indexProperties.contains(db))) )) {
+ DynamicEntity invItemData = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." +
+ aaiExtMap.getApiVersion() +
+ ".InventoryItemData");
+ invItemData.set("propertyName", db);
+ invItemData.set("propertyValue", "false");
+ itemDataList.add(invItemData);
+ }
+ }
+
+ item.set("inventoryItemData", itemDataList);
+ }
+
+ if( !resultSet.getSubResultSet().isEmpty() ){
+ DynamicEntity taggedInventoryItemList = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".TaggedInventoryItemList");
+
+ ListIterator<ResultSet> listItr = resultSet.getSubResultSet().listIterator();
+ ArrayList<DynamicEntity> inventoryItemList = new ArrayList<DynamicEntity>();
+
+ boolean hasItems = false;
+ while( listItr.hasNext() ){
+
+ DynamicEntity invItem = mapResult(g, logline,
+ jaxbContext,
+ aaiExtMap,
+ resultDetail,
+ includeNodeTypes,
+ listItr.next(),
+ invItemCount,
+ levelCount );
+ if (invItem != null) {
+ hasItems = true;
+ inventoryItemList.add(invItem); // dont add if excluded nodes
+ }
+ }
+
+ if (item != null && hasItems == true) {
+ taggedInventoryItemList.set("inventoryItem", inventoryItemList);
+ ArrayList<DynamicEntity> til = new ArrayList<DynamicEntity>();
+ til.add(taggedInventoryItemList);
+ item.set("taggedInventoryItemList", til);
+ }
+ }
+ }
+ if (!retArr.isEmpty())
+ logline.add("msg" + invItemCount, retArr.toString());
+ return item;
+
+ }// end of mapResult()
+
+
+ /**
+ * Gets the edge label.
+ *
+ * @param targetNodeType the target node type
+ * @param nodeType the node type
+ * @return the edge label
+ * @throws AAIException the AAI exception
+ */
+ public static String getEdgeLabel(String targetNodeType, String nodeType) throws AAIException{
+ String edRule = "";
+ String edgeLabel = "???";
+ Collection <String> edRuleColl = DbEdgeRules.EdgeRules.get(targetNodeType + "|" + nodeType);
+ Iterator <String> ruleItr = edRuleColl.iterator();
+ if( ruleItr.hasNext() ){
+ // For now, we only look for one type of edge between two nodes.
+ // We're just pulling off the edgeLabel which is the first thing on the list.
+ edRule = ruleItr.next();
+ String [] rules = edRule.split(",");
+ edgeLabel = rules[0];
+ }
+ else {
+ edRuleColl = DbEdgeRules.EdgeRules.get(nodeType + "|" + targetNodeType);
+ ruleItr = edRuleColl.iterator();
+ if( ruleItr.hasNext() ){
+ edRule = ruleItr.next();
+ String [] rules = edRule.split(",");
+ edgeLabel = rules[0];
+ } else {
+ // No edge rule found for this
+ String detail = "No EdgeRule found for passed nodeTypes: " + nodeType + ", " + targetNodeType + ".";
+ throw new AAIException("AAI_6120", detail);
+ }
+ }
+ return edgeLabel;
+ }
+
+
+ /**
+ * Run named query.
+ *
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param queryParameters the query parameters
+ * @param aaiExtMap the aai ext map
+ * @return the response
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ */
+ public Response runNamedQuery(String fromAppId, String transId, String queryParameters,
+ AAIExtensionMap aaiExtMap) throws JAXBException, AAIException {
+ // TODO Auto-generated method stub
+ AAIResources aaiResources = org.openecomp.aai.ingestModel.IngestModelMoxyOxm.aaiResourceContainer
+ .get(aaiExtMap.getApiVersion());
+ DynamicJAXBContext jaxbContext = aaiResources.getJaxbContext();
+ JAXBUnmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+
+ //String dynamicClass = aaiRes.getResourceClassName();
+
+ DynamicEntity inventoryItems;
+ boolean success = true;
+ TitanTransaction g = null;
+ try {
+ g = AAIGraph.getInstance().getGraph().newTransaction();
+ if (aaiExtMap.getHttpServletRequest().getContentType() == null || // default to json
+ aaiExtMap.getHttpServletRequest().getContentType().contains("application/json")) {
+ unmarshaller.setProperty("eclipselink.media-type", "application/json");
+ unmarshaller.setProperty("eclipselink.json.include-root", false);
+ }
+
+ if (queryParameters.length() == 0) {
+ queryParameters = "{}";
+ unmarshaller.setProperty("eclipselink.media-type", "application/json");
+ unmarshaller.setProperty("eclipselink.json.include-root", false);
+ }
+ String dynamicClass = "inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".ModelAndNamedQuerySearch";
+ Class<? extends DynamicEntity> resultClass = jaxbContext.newDynamicEntity(dynamicClass).getClass();
+
+ StringReader reader = new StringReader(queryParameters);
+
+ DynamicEntity modelAndNamedQuerySearch = (DynamicEntity) unmarshaller.unmarshal(new StreamSource(reader), resultClass).getValue();
+
+ if (modelAndNamedQuerySearch == null) {
+ throw new AAIException("AAI_5105");
+ }
+
+ HashMap<String,Object> namedQueryLookupHash = new HashMap<String,Object>();
+
+ DynamicEntity qp = modelAndNamedQuerySearch.get("queryParameters");
+
+ String namedQueryUuid = null;
+ if (qp.isSet("namedQuery")) {
+ DynamicEntity namedQuery = (DynamicEntity) qp.get("namedQuery");
+
+ if (namedQuery.isSet("namedQueryUuid")) {
+ namedQueryUuid = namedQuery.get("namedQueryUuid");
+ }
+ if (namedQuery.isSet("namedQueryName")) {
+ namedQueryLookupHash.put("named-query-name", namedQuery.get("namedQueryName"));
+ }
+ if (namedQuery.isSet("namedQueryVersion")) {
+ namedQueryLookupHash.put("named-query-version", namedQuery.get("namedQueryVersion"));
+ }
+ }
+
+ if (namedQueryUuid == null) {
+ ArrayList<TitanVertex> namedQueryVertices = DbMeth.getNodes(transId, fromAppId, g, "named-query", namedQueryLookupHash, false);
+
+ for (TitanVertex vert : namedQueryVertices) {
+ namedQueryUuid = vert.<String>property("named-query-uuid").orElse(null);
+ // there should only be one, we'll pick the first if not
+ break;
+ }
+ }
+
+ ArrayList<HashMap<String,Object>> startNodeFilterHash = new ArrayList<HashMap<String,Object>>();
+
+ mapInstanceFilters((DynamicEntity)modelAndNamedQuerySearch.get("instanceFilters"),
+ startNodeFilterHash, jaxbContext);
+
+ ArrayList<ResultSet> resultSet = ModelBasedProcessing.queryByNamedQuery(transId, fromAppId, g,
+ namedQueryUuid, startNodeFilterHash, aaiExtMap.getApiVersion() );
+
+ inventoryItems = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItems");
+
+ HashMap<Object,String> objectToVertMap = new HashMap<Object,String>();
+ ArrayList<DynamicEntity> invItemList = unpackResultSet(g, resultSet, jaxbContext, aaiResources, objectToVertMap, aaiExtMap);
+
+ inventoryItems.set("inventoryResponseItem", invItemList);
+ success = true;
+ } catch (AAIException e) {
+ aaiLogger.info(logline, false, e.getErrorObject().getErrorCodeString());
+ success = false;
+ throw e;
+ } catch (Exception e) {
+ aaiLogger.info(logline, false, "AAI_5105");
+ success = false;
+ throw new AAIException("AAI_5105", e);
+ } finally {
+ if (g != null) {
+ if (success) {
+ g.commit();
+ } else {
+ g.rollback();
+ }
+ }
+ }
+
+ aaiLogger.info(logline, true, "0");
+
+ return getResponseFromDynamicEntity(inventoryItems, jaxbContext, aaiExtMap);
+ }
+
+ /**
+ * Execute model operation.
+ *
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param queryParameters the query parameters
+ * @param isDelete the is delete
+ * @param aaiExtMap the aai ext map
+ * @return the response
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ * @throws DynamicException the dynamic exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ public Response executeModelOperation(String fromAppId, String transId, String queryParameters, boolean isDelete,
+ AAIExtensionMap aaiExtMap) throws JAXBException, AAIException, DynamicException, UnsupportedEncodingException {
+ // TODO Auto-generated method stub
+ AAIResources aaiResources = org.openecomp.aai.ingestModel.IngestModelMoxyOxm.aaiResourceContainer
+ .get(aaiExtMap.getApiVersion());
+ DynamicJAXBContext jaxbContext = aaiResources.getJaxbContext();
+ JAXBUnmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+
+ //String dynamicClass = aaiRes.getResourceClassName();
+ Response response;
+ boolean success = true;
+ TitanTransaction g = null;
+ try {
+
+ g = AAIGraph.getInstance().getGraph().newTransaction();
+
+
+ if (aaiExtMap.getHttpServletRequest().getContentType() == null || // default to json
+ aaiExtMap.getHttpServletRequest().getContentType().contains("application/json")) {
+ unmarshaller.setProperty("eclipselink.media-type", "application/json");
+ unmarshaller.setProperty("eclipselink.json.include-root", false);
+ }
+
+ if (queryParameters.length() == 0) {
+ queryParameters = "{}";
+ unmarshaller.setProperty("eclipselink.media-type", "application/json");
+ unmarshaller.setProperty("eclipselink.json.include-root", false);
+ }
+ String dynamicClass = "inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".ModelAndNamedQuerySearch";
+ Class<? extends DynamicEntity> resultClass = jaxbContext.newDynamicEntity(dynamicClass).getClass();
+
+ StringReader reader = new StringReader(queryParameters);
+
+ DynamicEntity modelAndNamedQuerySearch = (DynamicEntity) unmarshaller.unmarshal(new StreamSource(reader), resultClass).getValue();
+
+ if (modelAndNamedQuerySearch == null) {
+ throw new AAIException("AAI_5105");
+ }
+
+ HashMap<String,Object> modelQueryLookupHash = new HashMap<String,Object>();
+
+ String modelNameVersionId = null;
+ String modelName = null;
+ String modelId = null;
+ String modelVersion = null;
+ String topNodeType = null;
+
+ if (modelAndNamedQuerySearch.isSet("topNodeType")) {
+ topNodeType = modelAndNamedQuerySearch.get("topNodeType");
+ }
+ if (modelAndNamedQuerySearch.isSet("queryParameters")) {
+ DynamicEntity qp = modelAndNamedQuerySearch.get("queryParameters");
+
+ if (qp.isSet("model")) {
+ DynamicEntity model = (DynamicEntity) qp.get("model");
+
+ if (model.isSet("modelNameVersionId")) {
+ modelNameVersionId = model.get("modelNameVersionId");
+ }
+ if (model.isSet("modelName")) {
+ modelName = model.get("modelName");
+ modelQueryLookupHash.put("model-name", modelName);
+ }
+ if (model.isSet("modelId")) {
+ modelId = model.get("modelId");
+ modelQueryLookupHash.put("model-id", modelId);
+ }
+ if (model.isSet("modelVersion")) {
+ modelVersion = model.get("modelVersion");
+ modelQueryLookupHash.put("model-version", modelVersion);
+ }
+ }
+
+ if (modelNameVersionId == null ) {
+ if (modelId != null || modelName != null) {
+ ArrayList<TitanVertex> modelVertices = DbMeth.getNodes(transId, fromAppId, g, "model", modelQueryLookupHash, false);
+ for (TitanVertex vert : modelVertices) {
+ modelNameVersionId = vert.<String>property("model-name-version-id").orElse(null);
+ // there should only be one, we'll pick the first if not
+ break;
+ }
+ } else {
+ throw new AAIException("AAI_6132", "Could not determine model to use.");
+ }
+ }
+ }
+ ArrayList< HashMap<String,Object> > startNodeFilterHash = new ArrayList< HashMap<String,Object> >();
+
+ String resourceVersion = mapInstanceFilters((DynamicEntity)modelAndNamedQuerySearch.get("instanceFilters"),
+ startNodeFilterHash, jaxbContext);
+
+ if (isDelete) {
+
+ ArrayList<ResultSet> resultSet = ModelBasedProcessing.queryByModel(transId, fromAppId, g,
+ modelNameVersionId, modelId, modelName, topNodeType, startNodeFilterHash, aaiExtMap.getApiVersion() );
+
+ new ArrayList<DynamicEntity>();
+
+ HashMap<Object,String> objectToVertMap = new HashMap<Object,String>();
+ ArrayList<DynamicEntity> invItemList = unpackResultSet(g, resultSet, jaxbContext, aaiResources, objectToVertMap, aaiExtMap);
+
+ ResultSet rs = resultSet.get(0);
+
+ TitanVertex firstVert = rs.getVert();
+ String restURL = RestURL.get(g, firstVert);
+
+ HashMap<String,String> delResult = ModelBasedProcessing.runDeleteByModel( transId, fromAppId, g,
+ modelNameVersionId, topNodeType, startNodeFilterHash.get(0), aaiExtMap.getApiVersion(), resourceVersion );
+
+ String resultStr = "";
+ for (Map.Entry<String,String> ent : delResult.entrySet()) {
+ resultStr += "v[" + ent.getKey() + "] " + ent.getValue() + ",\n";
+ }
+ resultStr.trim();
+
+ DynamicEntity inventoryItems = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItems");
+ DynamicEntity topInvItem = remapInventoryItems(invItemList.get(0), jaxbContext, delResult, objectToVertMap, aaiExtMap);
+
+ List<DynamicEntity> newInvItemList = new ArrayList<DynamicEntity>();
+ newInvItemList.add(topInvItem);
+ inventoryItems.set("inventoryResponseItem", newInvItemList);
+
+ // put the inventoryItems in a UEB notification object
+ String notificationVersion = AAIConfig.get("aai.notification.current.version");
+
+ AAIResources aaiNotificationResources = org.openecomp.aai.ingestModel.IngestModelMoxyOxm.aaiResourceContainer
+ .get(notificationVersion);
+
+ DynamicJAXBContext notificationJaxbContext = aaiNotificationResources.getJaxbContext();
+
+ DynamicEntity notificationHeader = notificationJaxbContext
+ .getDynamicType("inventory.aai.openecomp.org." + notificationVersion + ".NotificationEventHeader")
+ .newDynamicEntity();
+
+ notificationHeader.set("entityLink", restURL);
+ notificationHeader.set("action", "DELETE");
+
+ notificationHeader.set("entityType", "inventory-response-items");
+ notificationHeader.set("topEntityType", "inventory-response-items");
+ notificationHeader.set("sourceName", aaiExtMap.getFromAppId());
+ notificationHeader.set("version", notificationVersion);
+
+ StoreNotificationEvent sne = new StoreNotificationEvent();
+
+ sne.storeDynamicEvent(notificationJaxbContext, notificationVersion, notificationHeader, inventoryItems);
+
+ response = Response.ok(resultStr).build();
+
+ } else {
+ ArrayList<ResultSet> resultSet = ModelBasedProcessing.queryByModel( transId, fromAppId, g,
+ modelNameVersionId, null, modelName, topNodeType, startNodeFilterHash, aaiExtMap.getApiVersion() );
+
+ DynamicEntity inventoryItems = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItems");
+
+ new ArrayList<DynamicEntity>();
+ HashMap<Object,String> objectToVertMap = new HashMap<Object,String>();
+ ArrayList<DynamicEntity> invItemList = unpackResultSet(g, resultSet, jaxbContext, aaiResources, objectToVertMap, aaiExtMap);
+
+ inventoryItems.set("inventoryResponseItem", invItemList);
+
+ response = getResponseFromDynamicEntity(inventoryItems, jaxbContext, aaiExtMap);
+ }
+ success = true;
+ } catch (AAIException e) {
+ success = false;
+ aaiLogger.info(logline, false, e.getErrorObject().getErrorCodeString());
+ throw e;
+ } catch (Exception e) {
+ success = false;
+ aaiLogger.info(logline, false, "AAI_5105");
+ throw new AAIException("AAI_5105", e);
+ } finally {
+ if (g != null) {
+ if (success) {
+ g.commit();
+ } else {
+ g.rollback();
+ }
+ }
+ }
+
+ aaiLogger.info(logline, true, "0");
+ return response;
+ }
+
+ /**
+ *
+ *
+ * @param g the g
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param avZoVtx the av zo vtx
+ * @param jaxbContext the jaxb context
+ * @param aaiExtMap the aai ext map
+ * @return zone type of AvailabilityZone
+ * @throws AAIException the AAI exception
+ */
+ private DynamicEntity getAvailabilityZone(TitanTransaction g, String fromAppId,
+ String transId,
+ TitanVertex avZoVtx,
+ DynamicJAXBContext jaxbContext,
+ AAIExtensionMap aaiExtMap) throws AAIException {
+ logline.init(COMPONENT, transId, fromAppId, "getAvailabilityZone");
+ String azName = avZoVtx.<String>property("availability-zone-name").toString();
+ logline.add("availability-zone-name", avZoVtx.<String>property("availability-zone-name").toString());
+
+ DynamicEntity zone = null;
+
+ if (aaiExtMap.getApiVersion().equals("v2"))
+ zone = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.AvailabilityZone");
+ else
+ zone = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".AvailabilityZone");
+
+ try {
+ zone.set("availabilityZoneName", azName);
+ if (avZoVtx.<String>property("hypervisor-type") != null) {
+ zone.set("hypervisorType", avZoVtx.<String>property("hypervisor-type").orElse(null));
+ }
+ if (avZoVtx.<String>property("operational-state") != null) {
+ zone.set("operationalState", (avZoVtx.<String>property("operational-state").orElse(null)));
+ }
+
+ String defaultApiVersion = AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP);
+
+ zone.set("relationshipList", RelationshipGraph.getRelationships(g, avZoVtx, defaultApiVersion, aaiExtMap));
+
+ } catch (AAIException e) {
+ aaiLogger.info(logline, false, e.getErrorObject().getErrorCodeString());
+ throw e;
+ } catch (Exception e) {
+ aaiLogger.info(logline, false, "AAI_5105");
+ throw new AAIException("AAI_5105", e);
+ }
+
+ aaiLogger.info(logline, true, "0");
+ return zone;
+ }
+
+
+ /**
+ *
+ *
+ * @param g the g
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param swVtx the sw vtx
+ * @param jaxbContext the jaxb context
+ * @param aaiExtMap the aai ext map
+ * @return DvsSwitch
+ * @throws AAIException the AAI exception
+ */
+ private DynamicEntity getDvsSwitch(TitanTransaction g, String fromAppId,
+ String transId,
+ TitanVertex swVtx,
+ DynamicJAXBContext jaxbContext,
+ AAIExtensionMap aaiExtMap) throws AAIException {
+ logline.init(COMPONENT, transId, fromAppId, "getDvsSwitch");
+ logline.add("switch-name", swVtx.<String>property("switch-name").toString());
+ DynamicEntity dvs = null;
+ if (aaiExtMap.getApiVersion().equals("v2"))
+ dvs = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.DvsSwitch");
+ else
+ dvs = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".DvsSwitch");
+
+ try {
+ if (swVtx.<String>property("switch-name") != null) {
+ dvs.set("switchName", swVtx.<String>property("switch-name").orElse(null));
+ }
+ if (swVtx.<String>property("vcenter-url") != null) {
+ dvs.set("vcenterUrl", swVtx.<String>property("vcenter-url").orElse(null));
+ }
+ String defaultApiVersion = AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP);
+
+ dvs.set("relationshipList", RelationshipGraph.getRelationships(g, swVtx, defaultApiVersion, aaiExtMap));
+
+
+ } catch (AAIException e) {
+ aaiLogger.info(logline, false, e.getErrorObject().getErrorCodeString());
+ throw e;
+ } catch (Exception e) {
+ aaiLogger.info(logline, false, "AAI_5105");
+ throw new AAIException("AAI_5105", e);
+ }
+
+ aaiLogger.info(logline, true, "0");
+ return dvs;
+ }
+
+
+ /**
+ *
+ *
+ * @param g the g
+ * @param fromAppId the from app id
+ * @param transId the trans id
+ * @param oamVtx the oam vtx
+ * @param jaxbContext the jaxb context
+ * @param aaiExtMap the aai ext map
+ * @return oam type of OamNetwork
+ * @throws AAIException the AAI exception
+ */
+ private DynamicEntity getOamNetwork(TitanTransaction g, String fromAppId,
+ String transId,
+ TitanVertex oamVtx,
+ DynamicJAXBContext jaxbContext,
+ AAIExtensionMap aaiExtMap) throws AAIException {
+ logline.init(COMPONENT, transId, fromAppId, "getOamNetwork");
+ String networkUuid = oamVtx.<String>property("network-uuid").toString();
+ logline.add("oam-network", networkUuid );
+
+ DynamicEntity oam = null;
+ if (aaiExtMap.getApiVersion().equals("v2"))
+ oam = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org.OamNetwork");
+ else
+ oam = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".OamNetwork");
+
+ try {
+ oam.set("networkUuid", networkUuid);
+ if (oamVtx.<String>property("network-name") != null) {
+ oam.set("networkName", oamVtx.<String>property("network-name").orElse(null));
+ }
+
+ Object cvt = oamVtx.<String>property("cvlan-tag");
+ if (cvt instanceof Long) {
+ oam.set("cvlanTag", (Long) cvt);
+ }
+ if (cvt instanceof Integer) {
+ Integer tmp = (Integer) cvt;
+ oam.set("cvlanTag", (Long) tmp.longValue());
+ }
+ if (oamVtx.<String>property("ipv4-oam-gateway-address") != null) {
+ oam.set("ipv4OamGatewayAddress", oamVtx.<String>property("ipv4-oam-gateway-address").orElse(null));
+ }
+ Object len = oamVtx.<String>property("ipv4-oam-gateway-address-prefix-length");
+ if (len instanceof Integer) {
+ oam.set("ipv4OamGatewayAddressPrefixLength", (Integer) len);
+ }
+
+ String defaultApiVersion = AAIConfig.get(AAIConstants.AAI_DEFAULT_API_VERSION_PROP);
+
+ DynamicEntity relationships = RelationshipGraph.getRelationships(g, oamVtx, defaultApiVersion, aaiExtMap);
+ oam.set("relationshipList", relationships);
+
+ } catch (AAIException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new AAIException("AAI_5105", e);
+ }
+ aaiLogger.info(logline, true, "0");
+ return oam;
+ }
+
+
+
+ /**
+ * Gets the response from dynamic entity.
+ *
+ * @param searchResult the search result
+ * @param jaxbContext the jaxb context
+ * @param aaiExtMap the aai ext map
+ * @return the response from dynamic entity
+ * @throws JAXBException the JAXB exception
+ */
+ private Response getResponseFromDynamicEntity(DynamicEntity searchResult,
+ DynamicJAXBContext jaxbContext,
+ AAIExtensionMap aaiExtMap) throws JAXBException {
+ Response response = null;
+ JAXBMarshaller marshaller = jaxbContext.createMarshaller();
+ marshaller.setProperty(JAXBMarshaller.JAXB_FORMATTED_OUTPUT, false);
+
+ for (MediaType mt : aaiExtMap.getHttpHeaders().getAcceptableMediaTypes()) {
+ if (MediaType.APPLICATION_JSON_TYPE.isCompatible(mt)) {
+ marshaller.setProperty("eclipselink.media-type", "application/json");
+ marshaller.setProperty("eclipselink.json.include-root", false);
+ marshaller.setProperty(MarshallerProperties.JSON_VALUE_WRAPPER, "property-value");
+ marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, Boolean.FALSE) ;
+ }
+ }
+
+ StringWriter writer = new StringWriter();
+ marshaller.marshal(searchResult, writer);
+
+ response = Response.ok(searchResult).entity(writer.toString()).build();
+ return response;
+ }
+
+ /**
+ * Map instance filters.
+ *
+ * @param instanceFilters the instance filters
+ * @param startNodeFilterHash the start node filter hash
+ * @param jaxbContext the jaxb context
+ * @return the string
+ */
+ private String mapInstanceFilters(DynamicEntity instanceFilters, ArrayList<HashMap<String,Object>> startNodeFilterHash, DynamicJAXBContext jaxbContext) {
+
+ if (instanceFilters == null || !instanceFilters.isSet("instanceFilter")) {
+ return null;
+ }
+ @SuppressWarnings("unchecked")
+ List<DynamicEntity> instanceFilter = (ArrayList<DynamicEntity>)instanceFilters.get("instanceFilter");
+ String resourceVersion = null;
+
+ for (DynamicEntity instFilt : instanceFilter) {
+ List<DynamicEntity> any = instFilt.get("any");
+ HashMap<String,Object> thisNodeFilterHash = new HashMap<String,Object>();
+ for (DynamicEntity anyEnt : any) {
+ String clazz = anyEnt.getClass().getCanonicalName();
+ String simpleClazz = anyEnt.getClass().getSimpleName();
+
+ String nodeType = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, simpleClazz);
+
+ DynamicType anyEntType = jaxbContext.getDynamicType(clazz);
+
+ for (String propName : anyEntType.getPropertiesNames()) {
+ // hyphencase the prop and throw it on the hash
+ if (anyEnt.isSet(propName)) {
+ thisNodeFilterHash.put(nodeType + "." + CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, propName), anyEnt.get(propName));
+ if (propName.equals("resourceVersion") && resourceVersion == null) {
+ resourceVersion = (String)anyEnt.get(propName);
+ }
+ }
+ }
+ }
+ startNodeFilterHash.add(thisNodeFilterHash);
+ }
+ return resourceVersion;
+ }
+
+ /**
+ * Remap inventory items.
+ *
+ * @param invResultItem the inv result item
+ * @param jaxbContext the jaxb context
+ * @param includeTheseVertices the include these vertices
+ * @param objectToVertMap the object to vert map
+ * @param aaiExtMap the aai ext map
+ * @return the dynamic entity
+ */
+ private DynamicEntity remapInventoryItems(DynamicEntity invResultItem, DynamicJAXBContext jaxbContext,
+ HashMap<String,String> includeTheseVertices, HashMap<Object,String> objectToVertMap, AAIExtensionMap aaiExtMap) {
+
+
+ DynamicEntity inventoryItem = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItem");
+ Object item = invResultItem.get("item");
+ inventoryItem.set("modelName", invResultItem.get("modelName"));
+ inventoryItem.set("item", item);
+ inventoryItem.set("extraProperties", invResultItem.get("extraProperties"));
+
+ String vertexId = "";
+
+ if (objectToVertMap.containsKey(item)) {
+ vertexId = objectToVertMap.get(item);
+ }
+
+ if (includeTheseVertices.containsKey(vertexId)) {
+ if (invResultItem.isSet("inventoryResponseItems")) {
+ List<DynamicEntity> invItemList = new ArrayList<DynamicEntity>();
+ DynamicEntity inventoryItems = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItems");
+ DynamicEntity subInventoryResponseItems = invResultItem.get("inventoryResponseItems");
+ List<DynamicEntity> subInventoryResponseItemList = subInventoryResponseItems.get("inventoryResponseItem");
+ for (DynamicEntity ent : subInventoryResponseItemList) {
+ DynamicEntity invItem = remapInventoryItems(ent, jaxbContext, includeTheseVertices, objectToVertMap, aaiExtMap);
+ if (invItem != null) {
+ invItemList.add(invItem);
+ }
+ }
+ if (invItemList != null) {
+ inventoryItems.set("inventoryResponseItem", invItemList);
+ inventoryItem.set("inventoryResponseItems", inventoryItems);
+ }
+ }
+ }
+ return inventoryItem;
+ }
+
+ /**
+ * Unpack result set.
+ *
+ * @param g the g
+ * @param resultSetList the result set list
+ * @param jaxbContext the jaxb context
+ * @param aaiResources the aai resources
+ * @param objectToVertMap the object to vert map
+ * @param aaiExtMap the aai ext map
+ * @return the array list
+ * @throws AAIException the AAI exception
+ */
+ // this should return an inventoryItem
+ private ArrayList<DynamicEntity> unpackResultSet(TitanTransaction g, ArrayList<ResultSet> resultSetList,
+ DynamicJAXBContext jaxbContext,
+ AAIResources aaiResources,
+ HashMap<Object,String> objectToVertMap,
+ AAIExtensionMap aaiExtMap) throws AAIException {
+
+ ArrayList<DynamicEntity> resultList = new ArrayList<DynamicEntity>();
+
+ for (ResultSet resultSet : resultSetList) {
+
+ DynamicEntity inventoryItem = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItem");
+ DynamicEntity inventoryItems = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".InventoryResponseItems");
+
+ // add this inventoryItem to the resultList for this level
+ resultList.add(inventoryItem);
+
+ TitanVertex vert = resultSet.getVert();
+
+ Long vertId = (Long)vert.longId();
+
+ String aaiNodeType = vert.<String>property("aai-node-type").orElse(null);
+
+ String simpleName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL,aaiNodeType);
+ // find an aaiResource with this node as the last element
+
+ AAIResource aaiRes = null;
+ for (Map.Entry<String,AAIResource> ent: aaiResources.getAaiResources().entrySet()) {
+ AAIResource res = ent.getValue();
+ if (res.getSimpleName().equals(simpleName)) {
+ aaiRes = res;
+ break;
+ }
+ }
+
+ if (aaiRes != null) {
+ PojoUtils pu = new PojoUtils();
+ DynamicEntity thisObj = jaxbContext.newDynamicEntity(aaiRes.getResourceClassName());
+
+ if (resultSet.getExtraPropertyHash() != null) {
+ HashMap<String,Object> extraProperties = resultSet.getExtraPropertyHash();
+
+ DynamicEntity extraPropertiesEntity = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".ExtraProperties");
+
+ List<DynamicEntity> extraPropsList = new ArrayList<DynamicEntity>();
+
+ for (Map.Entry<String,Object> ent : extraProperties.entrySet()) {
+ String propName = ent.getKey();
+ Object propVal = ent.getValue();
+
+ DynamicEntity extraPropEntity = jaxbContext.newDynamicEntity("inventory.aai.openecomp.org." + aaiExtMap.getApiVersion() + ".ExtraProperty");
+
+ extraPropEntity.set("propertyName", propName);
+ extraPropEntity.set("propertyValue", propVal);
+
+ extraPropsList.add(extraPropEntity);
+
+ }
+ extraPropertiesEntity.set("extraProperty", extraPropsList);
+ inventoryItem.set("extraProperties", extraPropertiesEntity);
+ }
+ String propertyLimitDesc = resultSet.getPropertyLimitDesc();
+
+ if (propertyLimitDesc != null && propertyLimitDesc.length() > 0) {
+
+ if ("SHOW-NONE".equalsIgnoreCase(propertyLimitDesc)) {
+ HashMap<String,Object> emptyPropertyOverRideHash = new HashMap<String,Object>();
+ pu.getAaiDynamicObjectFromVertex(aaiRes, thisObj, vert, aaiRes.getPropertyDataTypeMap(), emptyPropertyOverRideHash);
+ } else if ("SHOW-ALL".equalsIgnoreCase(propertyLimitDesc)) {
+ pu.getAaiDynamicObjectFromVertex(aaiRes, thisObj, vert, aaiRes.getPropertyDataTypeMap());
+ } else if ("NAME-AND-KEYS-ONLY".equalsIgnoreCase(propertyLimitDesc)) {
+ AAIResourceKeys aaiResKeys = aaiRes.getAaiResourceKeys();
+ HashMap<String,Object> keysAndNamesPropHash = new HashMap<String,Object>();
+ for (AAIResourceKey aaiResKey : aaiResKeys.getAaiResourceKey()) {
+ keysAndNamesPropHash.put(aaiResKey.getKeyName(), "dummy");
+ }
+ for (String nodeNameProp : aaiRes.getNodeNameProps().get(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN,simpleName))) {
+ keysAndNamesPropHash.put(nodeNameProp, "dummy");
+ }
+ pu.getAaiDynamicObjectFromVertex(aaiRes, thisObj, vert, aaiRes.getPropertyDataTypeMap(), keysAndNamesPropHash);
+ }
+ } else {
+ if (resultSet.getPropertyOverRideHash() != null && resultSet.getPropertyOverRideHash().size() > 0) {
+ HashMap<String,Object> propertyOverRideHash = resultSet.getPropertyOverRideHash();
+ pu.getAaiDynamicObjectFromVertex(aaiRes, thisObj, vert, aaiRes.getPropertyDataTypeMap(), propertyOverRideHash);
+ } else {
+ pu.getAaiDynamicObjectFromVertex(aaiRes, thisObj, vert, aaiRes.getPropertyDataTypeMap());
+ }
+ }
+
+ if (thisObj != null) {
+ inventoryItem.set("item", thisObj);
+
+ objectToVertMap.put(thisObj, vertId.toString());
+
+ String modelName = null;
+ try {
+ String personaModelId = (String)vert.<String>property("persona-model-id").orElse(null);
+ String personaModelVersion = (String)vert.<String>property("persona-model-version").orElse(null);
+
+ if ( (personaModelId != null && personaModelVersion != null)
+ && (personaModelId.length() > 0 && personaModelVersion.length() > 0) ) {
+ HashMap<String,Object> modelLookupHash = new HashMap<String,Object>();
+
+ modelLookupHash.put("model-id", personaModelId);
+ modelLookupHash.put("model-version", personaModelVersion);
+
+ TitanVertex modelVert = DbMeth.getUniqueNode(aaiExtMap.getTransId(),
+ aaiExtMap.getFromAppId(), g, "model", modelLookupHash, null);
+
+ modelName = modelVert.<String>property("model-name").orElse(null);
+ // there should only be one, we'll pick the first if not
+ if (modelName.length() > 0) {
+ inventoryItem.set("modelName", modelName);
+ }
+ }
+ } catch (DynamicException e) {
+ ; // it's ok, dynamic object might not have these fields
+ } catch (AAIException e) {
+ if (e.getErrorObject().getErrorCode().equals("6114")) {
+ // it's ok, couldn't find a matching model
+ } else {
+ throw e;
+ }
+ }
+
+ if (resultSet.getSubResultSet() != null) {
+ ArrayList<ResultSet> subResultSet = resultSet.getSubResultSet();
+ if (subResultSet != null) {
+ ArrayList<DynamicEntity> res = unpackResultSet(g, subResultSet, jaxbContext, aaiResources, objectToVertMap, aaiExtMap);
+ if (res.size() > 0) {
+ inventoryItems.set("inventoryResponseItem", res);
+ inventoryItem.set("inventoryResponseItems", inventoryItems);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return resultList;
+ }
+
+}