/* * Copyright (c) 2002-2017 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This product is licensed to you under the Apache License, Version 2.0 (the "License"). * You may not use this product except in compliance with the License. * * This product may include a number of subcomponents with * separate copyright notices and license terms. Your use of the source * code for these subcomponents is subject to the terms and * conditions of the subcomponent's license, as noted in the LICENSE file. */ package org.neo4j.ogm.drivers.http.response; import java.util.*; import org.neo4j.ogm.response.model.NodeModel; import org.neo4j.ogm.response.model.RelationshipModel; import org.neo4j.ogm.result.adapter.ResultAdapter; /** * Adapt HTTP rest response to a NodeModels, RelaitonshipModels, and objects * * @author Luanne Misquitta */ public class RestModelAdapter implements ResultAdapter<Object[], Map<String, Object>> { private String[] columns; @Override public Map<String, Object> adapt(Object[] result) { Map<String, Object> adaptedResults = new LinkedHashMap<>(); for (int i = 0; i < columns.length; i++) { String column = columns[i]; Object value = result[i]; if (value instanceof Collection) { List<Object> adaptedValues = new ArrayList<>(); List<Object> values = (List) value; for (Object element : values) { adaptedValues.add(processData(element)); } adaptedResults.put(column, adaptedValues); } else { adaptedResults.put(column, processData(value)); } } return adaptedResults; } private Object processData(Object element) { if (element instanceof Map) { return buildEntity((Map) element); } return element; } private Object buildEntity(Map entity) { if (entity.containsKey("metadata") && ((Map) entity.get("metadata")).get("id") != null) { Map entityMetadata = (Map) entity.get("metadata"); if (entityMetadata.containsKey("labels")) { List<String> labelList = (List<String>) (entityMetadata.get("labels")); String[] labels = new String[labelList.size()]; labels = labelList.toArray(labels); NodeModel nodeModel = new NodeModel(); nodeModel.setId(((Number) entityMetadata.get("id")).longValue()); nodeModel.setProperties((Map) entity.get("data")); nodeModel.setLabels(labels); return nodeModel; } else if (entityMetadata.containsKey("type")) { String relationshipType = (String) entityMetadata.get("type"); RelationshipModel relationshipModel = new RelationshipModel(); relationshipModel.setId(((Number) entityMetadata.get("id")).longValue()); relationshipModel.setProperties((Map) entity.get("data")); relationshipModel.setType(relationshipType); String startURL = (String) entity.get("start"); String endURL = (String) entity.get("end"); relationshipModel.setStartNode(Long.valueOf(startURL.substring(startURL.lastIndexOf("/") + 1))); relationshipModel.setEndNode(Long.valueOf(endURL.substring(endURL.lastIndexOf("/") + 1))); return relationshipModel; } } return entity; } public void setColumns(String[] columns) { this.columns = columns; } }