All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cloud.sdk.service.prov.api.internal.DefaultEntityDataBuilder Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * (c) 201X SAP SE or an SAP affiliate company. All rights reserved.
 ******************************************************************************/
package com.sap.cloud.sdk.service.prov.api.internal;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.sap.cloud.sdk.service.prov.api.ElementType;
import com.sap.cloud.sdk.service.prov.api.EntityData;
import com.sap.cloud.sdk.service.prov.api.EntityDataBuilder;
import com.sap.cloud.sdk.service.prov.api.EntityMetadata;

public class DefaultEntityDataBuilder implements EntityDataBuilder {

	HashMap properties = new HashMap<>();
	List elements = new ArrayList<>();
	List associationElements = new ArrayList<>();
	List keys = new ArrayList<>();
	HashMap elementTypes = new HashMap<>();
	String entityName;
	String namespace;
	Map associationProperties = new HashMap<>();
	
	public DefaultEntityDataBuilder() {
		elements = new ArrayList<>();
	}
	
	public DefaultEntityDataBuilder(EntityData ed) {
		EntityMetadata em = ((HasMetadata)ed).getEntityMetadata();
		elements.addAll(em.getElementNames());
		Map localAssociationProperties = ed.getAssociations();
		if(localAssociationProperties != null && !localAssociationProperties.isEmpty()){
			associationProperties.putAll(localAssociationProperties);
		}
	 
		for(String element : elements) {
			if(ed.contains(element)) {
				properties.put(element, ed.getElementValue(element));
			}
		}
		keys.addAll(em.getKeyNames());
		entityName = em.getName();
		namespace = em.getNamespace();
		elementTypes = copyElementTypes(em);
		//Expanded child entity not propagated @AfterExit for OData V2
		associationElements = em.getAssociationNames();
		if (associationElements != null) {
			for(String associationElement : associationElements) {
				if(ed.contains(associationElement)) {
					properties.put(associationElement, ed.getElementValue(associationElement));
				}
			}
		}
	}
	
	private HashMap copyElementTypes(EntityMetadata em) {
		if(em instanceof DefaultEntityData)
			return ((DefaultEntityMetadata)em).getElementTypes();
		
		HashMap elementTypes = new HashMap<>();
		for(String element : em.getElementNames()) {
			elementTypes.put(element, em.getElementType(element));
		}
		
		return elementTypes;
	}

	@SuppressWarnings("unchecked")
	@Override
	public DefaultEntityDataBuilder addElement(String name, Object value) {
		if(!properties.containsKey(name) && !elements.contains(name))
			elements.add(name);
		properties.put(name, value);
		
		if(value instanceof HashMap) {
			elementTypes.put(name, ElementType.STRUCTURED_TYPE);
		}
		else {
			elementTypes.put(name, ElementType.SIMPLE_TYPE);
		}	
		return this;
	}
	
	private List getFlattenedElementsFromHashMap(String name, HashMap value) {
		
		List flattened = new ArrayList<>();
		if(value == null || value.isEmpty()){
			return flattened;
		}
		
		for(Entry entry : value.entrySet()) {
			String path = name + "." + entry.getKey();
			if(entry.getValue() instanceof HashMap) {
				flattened.addAll(getFlattenedElementsFromHashMap(path, (HashMap) entry.getValue()));
			}
			else
				flattened.add(path);
		}
		
		return flattened;
	}

	@Override
	public DefaultEntityDataBuilder addKeyElement(String name, Object value) {
		if(!elements.contains(name))
			elements.add(name);
		properties.put(name, value);
		if(!keys.contains(name))
			keys.add(name);
		
		if(value instanceof HashMap) {
			elementTypes.put(name, ElementType.STRUCTURED_TYPE);
		}
		else {
			elementTypes.put(name, ElementType.SIMPLE_TYPE);
		}	
		return this;
	}
	
	@Override
	public DefaultEntityDataBuilder removeElement(String name) {
		properties.remove(name);
		elements.remove(name);
		keys.remove(name);
		return this;
	}
	
	@Override
	public EntityData buildEntityData(String name) {
		List flattenedElements = new ArrayList<>();
		for(String element : elementTypes.keySet()) {
			ElementType type = elementTypes.get(element);
			if(type.equals(ElementType.SIMPLE_TYPE)) 
				flattenedElements.add(element);
			else {
				HashMap value = (HashMap) properties.get(element);
				flattenedElements.addAll(getFlattenedElementsFromHashMap(element, value));
			}

		}
		DefaultEntityMetadata em = new DefaultEntityMetadata()
				.setEntityName(name)
				.setElements(elements)
				.setKeys(keys)
				.setNamespace(namespace)
				.setElementTypes(elementTypes)
				.setFlattenedElements(flattenedElements);
		
		if(associationProperties.size() > 0){
			return new DefaultEntityData(properties, associationProperties, em);
		}else{
			return new DefaultEntityData(properties, em);
		}
	}

	@Override
	public EntityDataBuilder addAssociationElement(String name, Object value) {
		associationProperties.put(name, value);
		return this;
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy