/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.typescript.dto.model; import com.google.gson.internal.Primitives; import org.eclipse.che.dto.shared.DTO; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Map; import static org.eclipse.che.plugin.typescript.dto.DTOHelper.convertType; /** * A field model will used for providing class generation of a DTO * * @author Florent Benoit */ public class FieldAttributeModel { /** * Typescript value of the type of the field */ private final String typeName; /** * For Map, List object, need to initialize field first. Like new Field<>() */ private boolean needInitialize; /** * Name of the field */ private String fieldName; /** * Java Type of the object (used internally) */ private Type type; /** * This field type is a List of objects ? */ private boolean isList; /** * This field type is a simple primitive */ private boolean isPrimitive; /** * This field type is a map */ private boolean isMap; /** * This list type is in fact a list of DTOs */ private boolean isListOfDto; /** * This map type is a map of DTOs */ private boolean isMapOfDto; /** * The type is a DTO or a list of DTO and then this value is the name of the DTO implementation */ private String dtoImpl; /** * type is a DTO object. */ private boolean isDto; /** * type is a Enum object. */ private boolean isEnum; /** * Build a new field model based on the name and Java type * * @param fieldName * the name of the field * @param type * the Java raw type that will allow further analyzes */ public FieldAttributeModel(String fieldName, Type type) { this.fieldName = fieldName; this.type = type; this.typeName = convertType(type); if (typeName.startsWith("Array<") || typeName.startsWith("Map<")) { this.needInitialize = true; } if (this.type instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType)this.type; Type rawType = parameterizedType.getRawType(); analyzeParametrizedType(parameterizedType, rawType); } else if (Primitives.isPrimitive(this.type) || Primitives.isWrapperType(this.type) || String.class.equals(this.type)) { this.isPrimitive = true; } else if (this.type instanceof Class && ((Class)this.type).isAnnotationPresent(DTO.class)) { this.isDto = true; dtoImpl = this.type.getTypeName() + "Impl"; } else if (this.type instanceof Class && ((Class)this.type).isEnum()) { this.isEnum = true; } } /** * Analyze a complex parametrized type attribute (which can be a list or map for example) * @param parameterizedType * @param rawType */ protected void analyzeParametrizedType(ParameterizedType parameterizedType, Type rawType) { if (List.class.equals(rawType)) { this.isList = true; if (parameterizedType.getActualTypeArguments()[0] instanceof Class && ((Class)parameterizedType.getActualTypeArguments()[0]).isAnnotationPresent(DTO.class)) { isListOfDto = true; dtoImpl = convertType(parameterizedType.getActualTypeArguments()[0]) + "Impl"; } } else if (Map.class.equals(rawType)) { isMap = true; if (parameterizedType.getActualTypeArguments()[1] instanceof Class && ((Class)parameterizedType.getActualTypeArguments()[1]).isAnnotationPresent(DTO.class)) { isMapOfDto = true; dtoImpl = convertType(parameterizedType.getActualTypeArguments()[1]) + "Impl"; } } } public String getTypeName() { return typeName; } public String getFieldName() { return fieldName; } public Type getType() { return type; } public boolean isList() { return isList; } public boolean isPrimitive() { return isPrimitive; } public boolean isMap() { return isMap; } public boolean isListOfDto() { return isListOfDto; } public boolean isMapOfDto() { return isMapOfDto; } public String getDtoImpl() { return dtoImpl; } public boolean isDto() { return isDto; } public boolean isNeedInitialize() { return needInitialize; } public boolean isEnum() { return isEnum; } public String getName() { return this.fieldName; } public String getSimpleType() { return this.typeName; } }