AbstractCLTypeWithChildren.java
- package com.syntifi.casper.sdk.model.clvalue.cltype;
- import com.fasterxml.jackson.annotation.JsonIgnore;
- import com.syntifi.casper.sdk.exception.NoSuchTypeException;
- import lombok.EqualsAndHashCode;
- import lombok.Getter;
- import lombok.Setter;
- import java.lang.reflect.InvocationTargetException;
- import java.util.ArrayList;
- import java.util.LinkedHashMap;
- import java.util.List;
- import java.util.Map.Entry;
- /**
- * Base class for all types which have an array of child types
- *
- * @author Alexandre Carvalho
- * @author Andre Bertolace
- * @since 0.0.1
- */
- @Setter
- @Getter
- @EqualsAndHashCode(callSuper = false, of = {"childTypes"})
- public abstract class AbstractCLTypeWithChildren extends AbstractCLType {
- @JsonIgnore
- private List<AbstractCLType> childTypes = new ArrayList<>();
- private List<Object> childTypeObjects;
- protected void setChildTypeObjects(List<Object> childTypeObjects)
- throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
- NoSuchMethodException, SecurityException, NoSuchTypeException {
- this.childTypeObjects = childTypeObjects;
- this.loadCLTypes(childTypeObjects);
- }
- protected List<Object> getChildTypeObjects() {
- if (this.childTypeObjects == null) {
- this.childTypeObjects = new ArrayList<>();
- }
- this.childTypeObjects.clear();
- for (AbstractCLType childType : getChildTypes()) {
- if (childType instanceof AbstractCLTypeBasic) {
- this.childTypeObjects.add(childType.getTypeName());
- } else {
- this.childTypeObjects.add(childType);
- }
- }
- return this.childTypeObjects;
- }
- @JsonIgnore
- public CLTypeData getChildClTypeData(int index) throws NoSuchTypeException {
- return CLTypeData.getTypeByName(getChildTypes().get(index).getTypeName());
- }
- protected void loadCLTypes(List<Object> childTypeObjects)
- throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
- NoSuchMethodException, SecurityException, NoSuchTypeException {
- childTypes.clear();
- if (childTypeObjects != null) {
- for (Object childTypeObject : childTypeObjects) {
- addChildType(childTypeObject, childTypes);
- }
- }
- }
- private void addChildType(Object childTypeObject, List<AbstractCLType> parent)
- throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
- NoSuchMethodException, SecurityException, NoSuchTypeException {
- if (childTypeObject instanceof String) {
- parent.add(CLTypeData.getTypeByName(childTypeObject.toString()).getClTypeClass().getConstructor()
- .newInstance());
- } else if (childTypeObject instanceof ArrayList) {
- for (Object child : (ArrayList<?>) childTypeObject) {
- addChildType(child, parent);
- }
- } else if (childTypeObject instanceof LinkedHashMap) {
- LinkedHashMap<?, ?> subChildTypes = (LinkedHashMap<?, ?>) childTypeObject;
- for (Entry<?, ?> entry : subChildTypes.entrySet()) {
- AbstractCLType nextParent = CLTypeData.getTypeByName(entry.getKey().toString()).getClTypeClass()
- .getConstructor().newInstance();
- parent.add(nextParent);
- addChildType(entry.getValue(), ((AbstractCLTypeWithChildren) nextParent).getChildTypes());
- }
- }
- }
- }