From c8d962ad88da4403ae9186e7213a7ce28b82aaa1 Mon Sep 17 00:00:00 2001 From: sblimkie Date: Mon, 22 Jan 2018 19:29:18 -0500 Subject: [PATCH] Fix issue with patch requests Fix issue where patch commands were failing for non-string vertex properties Change-Id: I1cf25565fc121745e817c8292c99d4cdc89c4a35 Issue-ID: AAI-685 Signed-off-by: sblimkie --- src/main/java/org/onap/crud/dao/GraphDao.java | 16 +++--- .../java/org/onap/crud/dao/champ/ChampDao.java | 56 ++++++++++----------- src/main/java/org/onap/crud/entity/Vertex.java | 58 +++++++++++++++++++++- .../crud/service/AbstractGraphDataService.java | 4 +- .../crud/service/CrudAsyncGraphDataService.java | 2 +- .../onap/crud/service/CrudGraphDataService.java | 18 +++---- .../java/org/onap/schema/OxmModelValidator.java | 17 ++++--- 7 files changed, 113 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/onap/crud/dao/GraphDao.java b/src/main/java/org/onap/crud/dao/GraphDao.java index c62a788..7834bb2 100644 --- a/src/main/java/org/onap/crud/dao/GraphDao.java +++ b/src/main/java/org/onap/crud/dao/GraphDao.java @@ -34,9 +34,9 @@ import org.onap.crud.exception.CrudException; public interface GraphDao { - public Vertex getVertex(String id) throws CrudException; + public Vertex getVertex(String id, String version) throws CrudException; - public Vertex getVertex(String id, String type) throws CrudException; + public Vertex getVertex(String id, String type, String version) throws CrudException; /** * Retrieve all of the edges which are incident to the vertex with the @@ -111,7 +111,7 @@ public interface GraphDao { * @return - The {@link Vertex} object that was created. * @throws CrudException */ - public Vertex addVertex(String type, Map properties) throws CrudException; + public Vertex addVertex(String type, Map properties, String version) throws CrudException; /** * Updates an existing {@link Vertex}. @@ -123,7 +123,7 @@ public interface GraphDao { * @return - The udpated vertex. * @throws CrudException */ - public Vertex updateVertex(String id, String type, Map properties) throws CrudException; + public Vertex updateVertex(String id, String type, Map properties, String version) throws CrudException; /** * Removes the specified vertex from the graph data base. @@ -151,7 +151,7 @@ public interface GraphDao { * @return - The {@link Edge} object that was created. * @throws CrudException */ - public Edge addEdge(String type, Vertex source, Vertex target, Map properties) throws CrudException; + public Edge addEdge(String type, Vertex source, Vertex target, Map properties, String version) throws CrudException; /** * Updates an existing {@link Edge}. @@ -182,12 +182,12 @@ public interface GraphDao { public boolean transactionExists(String id) throws CrudException; - public Vertex addVertex(String type, Map properties, String txId) throws CrudException; + public Vertex addVertex(String type, Map properties, String version, String txId) throws CrudException; - public Edge addEdge(String type, Vertex source, Vertex target, Map properties, String txId) + public Edge addEdge(String type, Vertex source, Vertex target, Map properties, String version, String txId) throws CrudException; - public Vertex updateVertex(String id, String type, Map properties, String txId) throws CrudException; + public Vertex updateVertex(String id, String type, Map properties, String version, String txId) throws CrudException; public Edge updateEdge(Edge edge, String txId) throws CrudException; diff --git a/src/main/java/org/onap/crud/dao/champ/ChampDao.java b/src/main/java/org/onap/crud/dao/champ/ChampDao.java index ecbac36..0bf8368 100644 --- a/src/main/java/org/onap/crud/dao/champ/ChampDao.java +++ b/src/main/java/org/onap/crud/dao/champ/ChampDao.java @@ -95,12 +95,12 @@ public class ChampDao implements GraphDao { } @Override - public Vertex getVertex(String id) throws CrudException { + public Vertex getVertex(String id, String version) throws CrudException { String url = baseObjectUrl + "/" + id; OperationResult getResult = client.get(url, createHeader(), MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == 200) { - return Vertex.fromJson(getResult.getResult()); + return Vertex.fromJson(getResult.getResult(), version); } else { // We didn't find a vertex with the supplied id, so just throw an // exception. @@ -110,12 +110,12 @@ public class ChampDao implements GraphDao { } @Override - public Vertex getVertex(String id, String type) throws CrudException { + public Vertex getVertex(String id, String type, String version) throws CrudException { String url = baseObjectUrl + "/" + id; OperationResult getResult = client.get(url, createHeader(), MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == 200) { - Vertex vert = Vertex.fromJson(getResult.getResult()); + Vertex vert = Vertex.fromJson(getResult.getResult(), version); if (!vert.getType().equalsIgnoreCase(type)) { // We didn't find a vertex with the supplied type, so just throw an @@ -216,7 +216,7 @@ public class ChampDao implements GraphDao { } @Override - public Vertex addVertex(String type, Map properties) throws CrudException { + public Vertex addVertex(String type, Map properties, String version) throws CrudException { String url = baseObjectUrl; // Add the aai_node_type so that AAI can read the data created by gizmo @@ -231,7 +231,7 @@ public class ChampDao implements GraphDao { MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == Response.Status.CREATED.getStatusCode()) { - return Vertex.fromJson(getResult.getResult()); + return Vertex.fromJson(getResult.getResult(), version); } else { // We didn't create a vertex with the supplied type, so just throw an // exception. @@ -240,7 +240,7 @@ public class ChampDao implements GraphDao { } @Override - public Vertex updateVertex(String id, String type, Map properties) throws CrudException { + public Vertex updateVertex(String id, String type, Map properties, String version) throws CrudException { String url = baseObjectUrl + "/" + id; // Add the aai_node_type so that AAI can read the data created by gizmo @@ -257,11 +257,11 @@ public class ChampDao implements GraphDao { MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == Response.Status.OK.getStatusCode()) { - return Vertex.fromJson(getResult.getResult()); + return Vertex.fromJson(getResult.getResult(), version); } else { // We didn't create a vertex with the supplied type, so just throw an // exception. - throw new CrudException("Failed to update vertex", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to update vertex: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @@ -273,17 +273,17 @@ public class ChampDao implements GraphDao { if (getResult.getResultCode() != Response.Status.OK.getStatusCode()) { // We didn't delete a vertex with the supplied id, so just throw an // exception. - throw new CrudException("Failed to delete vertex", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to delete vertex: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @Override - public Edge addEdge(String type, Vertex source, Vertex target, Map properties) throws CrudException { + public Edge addEdge(String type, Vertex source, Vertex target, Map properties, String version) throws CrudException { String url = baseRelationshipUrl; // Try requests to ensure source and target exist in Champ - Vertex dbSource = getVertex(source.getId().get(), source.getType()); - Vertex dbTarget = getVertex(target.getId().get(), target.getType()); + Vertex dbSource = getVertex(source.getId().get(), source.getType(), version); + Vertex dbTarget = getVertex(target.getId().get(), target.getType(), version); Edge.Builder insertEdgeBuilder = new Edge.Builder(type).source(dbSource).target(dbTarget); properties.forEach(insertEdgeBuilder::property); @@ -298,7 +298,7 @@ public class ChampDao implements GraphDao { } else { // We didn't create an edge with the supplied type, so just throw an // exception. - throw new CrudException("Failed to create edge", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to create edge: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @@ -318,7 +318,7 @@ public class ChampDao implements GraphDao { } else { // We didn't create an edge with the supplied type, so just throw an // exception. - throw new CrudException("Failed to update edge", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to update edge: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @@ -386,7 +386,7 @@ public class ChampDao implements GraphDao { } @Override - public Vertex addVertex(String type, Map properties, String txId) throws CrudException { + public Vertex addVertex(String type, Map properties, String version, String txId) throws CrudException { String url = baseObjectUrl + "?transactionId=" + txId; // Add the aai_node_type so that AAI can read the data created by gizmo @@ -401,22 +401,22 @@ public class ChampDao implements GraphDao { MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == Response.Status.CREATED.getStatusCode()) { - return Vertex.fromJson(getResult.getResult()); + return Vertex.fromJson(getResult.getResult(), version); } else { // We didn't create a vertex with the supplied type, so just throw an // exception. - throw new CrudException("Failed to create vertex", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to create vertex: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @Override - public Edge addEdge(String type, Vertex source, Vertex target, Map properties, String txId) + public Edge addEdge(String type, Vertex source, Vertex target, Map properties, String version, String txId) throws CrudException { String url = baseRelationshipUrl + "?transactionId=" + txId; // Try requests to ensure source and target exist in Champ - Vertex dbSource = getVertex(source.getId().get(), source.getType(), txId); - Vertex dbTarget = getVertex(target.getId().get(), target.getType(), txId); + Vertex dbSource = getVertex(source.getId().get(), source.getType(), version, txId); + Vertex dbTarget = getVertex(target.getId().get(), target.getType(), version, txId); Edge.Builder insertEdgeBuilder = new Edge.Builder(type).source(dbSource).target(dbTarget); properties.forEach(insertEdgeBuilder::property); @@ -430,12 +430,12 @@ public class ChampDao implements GraphDao { } else { // We didn't create an edge with the supplied type, so just throw an // exception. - throw new CrudException("Failed to create edge", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to create edge: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @Override - public Vertex updateVertex(String id, String type, Map properties, String txId) throws CrudException { + public Vertex updateVertex(String id, String type, Map properties, String version, String txId) throws CrudException { String url = baseObjectUrl + "/" + id + "?transactionId=" + txId; // Add the aai_node_type so that AAI can read the data created by gizmo @@ -452,11 +452,11 @@ public class ChampDao implements GraphDao { MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == Response.Status.OK.getStatusCode()) { - return Vertex.fromJson(getResult.getResult()); + return Vertex.fromJson(getResult.getResult(), version); } else { // We didn't create a vertex with the supplied type, so just throw an // exception. - throw new CrudException("Failed to update vertex", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to update vertex: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @@ -468,7 +468,7 @@ public class ChampDao implements GraphDao { if (getResult.getResultCode() != Response.Status.OK.getStatusCode()) { // We didn't delete a vertex with the supplied id, so just throw an // exception. - throw new CrudException("Failed to delete vertex", Response.Status.fromStatusCode(getResult.getResultCode())); + throw new CrudException("Failed to delete vertex: " + getResult.getFailureCause(), Response.Status.fromStatusCode(getResult.getResultCode())); } } @@ -525,12 +525,12 @@ public class ChampDao implements GraphDao { } } - public Vertex getVertex(String id, String type, String txId) throws CrudException { + public Vertex getVertex(String id, String type, String version, String txId) throws CrudException { String url = baseObjectUrl + "/" + id + "?transactionId=" + txId; OperationResult getResult = client.get(url, createHeader(), MediaType.APPLICATION_JSON_TYPE); if (getResult.getResultCode() == 200) { - Vertex vert = Vertex.fromJson(getResult.getResult()); + Vertex vert = Vertex.fromJson(getResult.getResult(), version); if (!vert.getType().equalsIgnoreCase(type)) { // We didn't find a vertex with the supplied type, so just throw an diff --git a/src/main/java/org/onap/crud/entity/Vertex.java b/src/main/java/org/onap/crud/entity/Vertex.java index 42d0eef..8fddaa3 100644 --- a/src/main/java/org/onap/crud/entity/Vertex.java +++ b/src/main/java/org/onap/crud/entity/Vertex.java @@ -25,6 +25,7 @@ package org.onap.crud.entity; import net.dongliu.gson.GsonJava8TypeAdapterFactory; +import com.google.common.base.CaseFormat; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.annotations.SerializedName; @@ -32,6 +33,17 @@ import com.google.gson.annotations.SerializedName; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.Set; + +import org.eclipse.persistence.dynamic.DynamicType; +import org.eclipse.persistence.internal.helper.DatabaseField; +import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; +import org.eclipse.persistence.mappings.DatabaseMapping; +import org.json.JSONObject; +import org.onap.aaiutils.oxm.OxmModelLoader; +import org.onap.crud.exception.CrudException; +import org.onap.crud.util.CrudServiceUtil; +import org.onap.schema.OxmModelValidator; public class Vertex { private static final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new GsonJava8TypeAdapterFactory()) @@ -91,8 +103,50 @@ public class Vertex { return customGson.toJson(this); } - public static Vertex fromJson(String jsonString) { - return gson.fromJson(jsonString, Vertex.class); + public static Vertex fromJson(String jsonString, String version) throws CrudException { + Builder builder; + + try { + JSONObject doc = new JSONObject(jsonString); + String type = doc.getString("type"); + builder = new Builder(type).id(doc.getString("key")); + + type = OxmModelValidator.resolveCollectionType(version, type); + DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version); + String modelObjectClass = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type)); + + final DynamicType modelObjectType = jaxbContext.getDynamicType(modelObjectClass); + final DynamicType reservedType = jaxbContext.getDynamicType("ReservedPropNames"); + + + if (modelObjectType == null) { + throw new CrudException("Unable to load oxm version", javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR); + } + + if (doc.has("properties")) { + JSONObject jsonProps = doc.getJSONObject("properties"); + for (String key : (Set)jsonProps.keySet()) { + String keyJavaName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, key); + DatabaseMapping mapping = modelObjectType.getDescriptor().getMappingForAttributeName(keyJavaName); + + if (mapping == null) { + // This might be one of the reserved properties + mapping = reservedType.getDescriptor().getMappingForAttributeName(keyJavaName); + } + + if (mapping != null) { + DatabaseField field = mapping.getField(); + Object value = CrudServiceUtil.validateFieldType(jsonProps.get(key).toString(), field.getType()); + builder.property(key, value); + } + } + } + } + catch (Exception ex) { + throw new CrudException("Unable to transform response: " + jsonString, javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR); + } + + return builder.build(); } @Override diff --git a/src/main/java/org/onap/crud/service/AbstractGraphDataService.java b/src/main/java/org/onap/crud/service/AbstractGraphDataService.java index ef276a3..1163623 100644 --- a/src/main/java/org/onap/crud/service/AbstractGraphDataService.java +++ b/src/main/java/org/onap/crud/service/AbstractGraphDataService.java @@ -67,7 +67,7 @@ public abstract class AbstractGraphDataService { public String getVertex(String version, String id, String type) throws CrudException { type = OxmModelValidator.resolveCollectionType(version, type); - Vertex vertex = dao.getVertex(id, type); + Vertex vertex = dao.getVertex(id, type, version); List edges = dao.getVertexEdges(id); return CrudResponseBuilder.buildGetVertexResponse(OxmModelValidator.validateOutgoingPayload(version, vertex), edges, version); @@ -166,7 +166,7 @@ public abstract class AbstractGraphDataService { vertexPayload.setProperties(CrudServiceUtil.mergeHeaderInFoToPayload(vertexPayload.getProperties(), headers, false)); - Vertex existingVertex = dao.getVertex(vertexPayload.getId(), OxmModelValidator.resolveCollectionType(version, vertexPayload.getType())); + Vertex existingVertex = dao.getVertex(vertexPayload.getId(), OxmModelValidator.resolveCollectionType(version, vertexPayload.getType()), version); Vertex validatedVertex = OxmModelValidator.validateIncomingPatchPayload(vertexPayload.getId(), version, vertexPayload.getType(), vertexPayload.getProperties(), existingVertex); Vertex persistedVertex = updateBulkVertex(validatedVertex, vertexPayload.getId(), version, txId); diff --git a/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java b/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java index 60a18d3..b3e7551 100644 --- a/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java +++ b/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java @@ -261,7 +261,7 @@ public class CrudAsyncGraphDataService extends AbstractGraphDataService { public String patchVertex(String version, String id, String type, VertexPayload payload) throws CrudException { Vertex existingVertex - = dao.getVertex(id, OxmModelValidator.resolveCollectionType(version, type)); + = dao.getVertex(id, OxmModelValidator.resolveCollectionType(version, type), version); Vertex patchedVertex = OxmModelValidator.validateIncomingPatchPayload(id, version, type, payload.getProperties(), existingVertex); diff --git a/src/main/java/org/onap/crud/service/CrudGraphDataService.java b/src/main/java/org/onap/crud/service/CrudGraphDataService.java index a18ab3b..61550b2 100644 --- a/src/main/java/org/onap/crud/service/CrudGraphDataService.java +++ b/src/main/java/org/onap/crud/service/CrudGraphDataService.java @@ -46,7 +46,7 @@ public class CrudGraphDataService extends AbstractGraphDataService { } private String addVertex(String version, Vertex vertex) throws CrudException { - Vertex addedVertex = dao.addVertex(vertex.getType(), vertex.getProperties()); + Vertex addedVertex = dao.addVertex(vertex.getType(), vertex.getProperties(), version); return CrudResponseBuilder .buildUpsertVertexResponse(OxmModelValidator.validateOutgoingPayload(version, addedVertex), version); } @@ -57,7 +57,7 @@ public class CrudGraphDataService extends AbstractGraphDataService { } private String addEdge(String version, Edge edge) throws CrudException { - Edge addedEdge = dao.addEdge(edge.getType(), edge.getSource(), edge.getTarget(), edge.getProperties()); + Edge addedEdge = dao.addEdge(edge.getType(), edge.getSource(), edge.getTarget(), edge.getProperties(), version); return CrudResponseBuilder .buildUpsertEdgeResponse(RelationshipSchemaValidator.validateOutgoingPayload(version, addedEdge), version); } @@ -69,13 +69,13 @@ public class CrudGraphDataService extends AbstractGraphDataService { } private String updateVertex(String version, Vertex vertex) throws CrudException { - Vertex updatedVertex = dao.updateVertex(vertex.getId().get(), vertex.getType(), vertex.getProperties()); + Vertex updatedVertex = dao.updateVertex(vertex.getId().get(), vertex.getType(), vertex.getProperties(), version); return CrudResponseBuilder .buildUpsertVertexResponse(OxmModelValidator.validateOutgoingPayload(version, updatedVertex), version); } public String patchVertex(String version, String id, String type, VertexPayload payload) throws CrudException { - Vertex existingVertex = dao.getVertex(id, OxmModelValidator.resolveCollectionType(version, type)); + Vertex existingVertex = dao.getVertex(id, OxmModelValidator.resolveCollectionType(version, type), version); Vertex vertex = OxmModelValidator.validateIncomingPatchPayload(id, version, type, payload.getProperties(), existingVertex); return updateVertex(version, vertex); @@ -112,18 +112,18 @@ public class CrudGraphDataService extends AbstractGraphDataService { } - public Vertex getVertex(String id) throws CrudException { - return dao.getVertex(id); + public Vertex getVertex(String id, String version) throws CrudException { + return dao.getVertex(id, version); } @Override protected Vertex addBulkVertex(Vertex vertex, String version, String dbTransId) throws CrudException { - return dao.addVertex(vertex.getType(), vertex.getProperties(), dbTransId); + return dao.addVertex(vertex.getType(), vertex.getProperties(), version, dbTransId); } @Override protected Vertex updateBulkVertex(Vertex vertex, String id, String version, String dbTransId) throws CrudException { - return dao.updateVertex(id, vertex.getType(), vertex.getProperties(), dbTransId); + return dao.updateVertex(id, vertex.getType(), vertex.getProperties(), version, dbTransId); } @Override @@ -133,7 +133,7 @@ public class CrudGraphDataService extends AbstractGraphDataService { @Override protected Edge addBulkEdge(Edge edge, String version, String dbTransId) throws CrudException { - return dao.addEdge(edge.getType(), edge.getSource(), edge.getTarget(), edge.getProperties(), dbTransId); + return dao.addEdge(edge.getType(), edge.getSource(), edge.getTarget(), edge.getProperties(), version, dbTransId); } @Override diff --git a/src/main/java/org/onap/schema/OxmModelValidator.java b/src/main/java/org/onap/schema/OxmModelValidator.java index d23804c..6260f83 100644 --- a/src/main/java/org/onap/schema/OxmModelValidator.java +++ b/src/main/java/org/onap/schema/OxmModelValidator.java @@ -44,8 +44,12 @@ import javax.ws.rs.core.Response.Status; public class OxmModelValidator { public enum Metadata { - NODE_TYPE("aai-node-type"), URI("aai-uri"), CREATED_TS("aai-created-ts"), SOT("source-of-truth"), LAST_MOD_SOT( - "last-mod-source-of-truth"); + NODE_TYPE("aai-node-type"), + URI("aai-uri"), + CREATED_TS("aai-created-ts"), + UPDATED_TS("aai-last-mod-ts"), + SOT("source-of-truth"), + LAST_MOD_SOT("last-mod-source-of-truth"); private final String propName; @@ -143,7 +147,7 @@ public class OxmModelValidator { public static Vertex validateIncomingUpsertPayload(String id, String version, String type, JsonElement properties) throws CrudException { - + try { type = resolveCollectionType(version, type); DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version); @@ -226,7 +230,6 @@ public class OxmModelValidator { public static Vertex validateIncomingPatchPayload(String id, String version, String type, JsonElement properties, Vertex existingVertex) throws CrudException { - try { type = resolveCollectionType(version, type); DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version); @@ -276,14 +279,12 @@ public class OxmModelValidator { Object value = CrudServiceUtil.validateFieldType(entry.getValue().getAsString(), field.getType()); existingVertex.getProperties().put(entry.getKey(), value); } - } return existingVertex; } catch (Exception e) { throw new CrudException(e.getMessage(), Status.BAD_REQUEST); } - } private static DatabaseField getDatabaseField(String fieldName, DynamicType modelObjectType) { @@ -301,8 +302,7 @@ public class OxmModelValidator { return null; } - public static Vertex validateOutgoingPayload(String version, Vertex vertex) { - + public static Vertex validateOutgoingPayload(String version, Vertex vertex) { Vertex.Builder modelVertexBuilder = new Vertex.Builder(vertex.getType()).id(vertex.getId().get()); try { @@ -321,6 +321,7 @@ public class OxmModelValidator { } } } + return modelVertexBuilder.build(); } catch (Exception ex) { return vertex; -- 2.16.6