blob: d6381f6a2f31ce10ea75405270213e23b3ebc526 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.jaxb.javamodel.reflection;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.eclipse.persistence.jaxb.TypeMappingInfo;
import org.eclipse.persistence.jaxb.javamodel.JavaClass;
import org.eclipse.persistence.jaxb.javamodel.JavaModel;
import org.eclipse.persistence.jaxb.javamodel.JavaModelInput;
/**
* INTERNAL:
* <p><b>Purpose:</b>Provide access to an array of JavaClass instances
* and their associated JavaModel. This class will transform an array
* of Class objects to an array of JavaClasses.
*
* <p><b>Responsibilities:</b>
* <ul>
* <li>Create an array of JavaClass instances from an array of Classes</li>
* <li>Return an array of JavaClass objects to be used by the generator</li>
* <li>Return the JavaModel to be used during generation</li>
* </ul>
*
* @since Oracle TopLink 11.1.1.0.0
* @see org.eclipse.persistence.jaxb.javamodel.JavaClass
* @see org.eclipse.persistence.jaxb.javamodel.JavaModel
* @see org.eclipse.persistence.jaxb.javamodel.JavaModelInput
*/
public class JavaModelInputImpl implements JavaModelInput {
private JavaClass[] jClasses;
private JavaModel jModel;
private boolean facets;
/**
* This constructor builds an array of JavaClass objects from an array
* of Types. The JavaModel instance to be used is also set here.
*
* This constructor assumes that the a given type in the list will
* either be a Class or ParameterizedType.
*
*/
public JavaModelInputImpl(Type[] types, JavaModel javaModel) {
jModel = javaModel;
jClasses = new JavaClass[types.length];
for (int i=0; i<types.length; i++) {
TypeMappingInfo typeMappingInfo = new TypeMappingInfo();
Type type = types[i];
typeMappingInfo.setType(type);
jClasses[i] = buildJavaClassImpl(type);
}
}
public JavaModelInputImpl(TypeMappingInfo[] types, JavaModel javaModel) {
jModel = javaModel;
jClasses = new JavaClass[types.length];
for (int i=0; i<types.length; i++) {
TypeMappingInfo typeMappingInfo = types[i];
Type type = typeMappingInfo.getType();
jClasses[i] = buildJavaClassImpl(type);
}
}
public JavaModelInputImpl(Class[] classes, JavaModel javaModel) {
jModel = javaModel;
jClasses = new JavaClass[classes.length];
for (int i=0; i<classes.length; i++) {
jClasses[i] = javaModel.getClass(classes[i]);
}
}
private JavaClassImpl buildJavaClassImpl(Type type){
// type should be a Class or ParameterizedType
if (type instanceof Class) {
return (JavaClassImpl) jModel.getClass((Class) type);
} else if (type instanceof GenericArrayType) {
Class genericTypeClass = (Class) ((GenericArrayType) type).getGenericComponentType();
genericTypeClass = java.lang.reflect.Array.newInstance(genericTypeClass, 0).getClass();
return new JavaClassImpl(genericTypeClass, (JavaModelImpl) jModel);
} else {
// assume parameterized type
ParameterizedType pType = (ParameterizedType) type;
return new JavaClassImpl(pType, (Class) pType.getRawType(), (JavaModelImpl) jModel);
}
}
@Override
public JavaClass[] getJavaClasses() {
return jClasses;
}
@Override
public JavaModel getJavaModel() {
return jModel;
}
public boolean isFacets() {
return facets;
}
public void setFacets(boolean facets) {
this.facets = facets;
}
}