/******************************************************************************* * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.classfile; import org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass; import org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClassDescription; import org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalConstructor; import org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalField; import org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalMethod; import org.eclipse.persistence.tools.workbench.utility.classfile.ClassFile; import org.eclipse.persistence.tools.workbench.utility.classfile.Field; import org.eclipse.persistence.tools.workbench.utility.classfile.Method; import org.eclipse.persistence.tools.workbench.utility.string.StringTools; /** * Wrap a ClassFile. */ final class CFExternalClass implements ExternalClass { /** The wrapped class file. */ private final ClassFile classFile; /** The repository used to find other types. */ private final CFExternalClassDescription classDescription; // ********** Constructors ********** /** * Package-accessible constructor. */ CFExternalClass(ClassFile classFile, CFExternalClassDescription classDescription) { super(); this.classFile = classFile; this.classDescription = classDescription; } // ********** ExternalClass implementation ********** /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getDeclaredClasses() */ public ExternalClassDescription[] getDeclaredClasses() { return this.buildClassDescriptionArray(this.classFile.declaredMemberClassNames()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getDeclaredConstructors() */ public ExternalConstructor[] getDeclaredConstructors() { return this.buildConstructorArray(this.classFile.getMethodPool().declaredConstructors()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getDeclaredFields() */ public ExternalField[] getDeclaredFields() { return this.buildFieldArray(this.classFile.getFieldPool().declaredFields()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getDeclaredMethods() */ public ExternalMethod[] getDeclaredMethods() { return this.buildMethodArray(this.classFile.getMethodPool().declaredMethods()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getDeclaringClass() */ public ExternalClassDescription getDeclaringClass() { return this.classDescriptionNamed(this.classFile.declaringClassName()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getInterfaces() */ public ExternalClassDescription[] getInterfaces() { return this.buildClassDescriptionArray(this.classFile.interfaceNames()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getModifiers() */ public int getModifiers() { return this.classFile.standardAccessFlags(); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getName() */ public String getName() { return this.classFile.className(); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#getSuperclass() */ public ExternalClassDescription getSuperclass() { return this.classDescriptionNamed(this.classFile.superClassName()); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#isInterface() */ public boolean isInterface() { return this.classFile.isInterface(); } /** * @see org.eclipse.persistence.tools.workbench.mappingsmodel.spi.meta.ExternalClass#isPrimitive() */ public boolean isPrimitive() { return false; } // ********** standard methods ********** public String toString() { return StringTools.buildToStringFor(this, this.getName()); } // ********** package-accessible methods ********** ExternalClassDescription classDescriptionNamed(String className) { if (className == null) { return null; } return this.classDescription.classDescriptionNamed(className); } // ********** internal methods ********** private ExternalClassDescription[] buildClassDescriptionArray(String[] classNames) { ExternalClassDescription[] classDescriptions = new ExternalClassDescription[classNames.length]; for (int i = classNames.length; i-- > 0; ) { classDescriptions[i] = this.classDescriptionNamed(classNames[i]); } return classDescriptions; } private ExternalConstructor[] buildConstructorArray(Method[] constructors) { ExternalConstructor[] externalConstructors = new ExternalConstructor[constructors.length]; for (int i = constructors.length; i-- > 0; ) { externalConstructors[i] = new CFExternalConstructor(constructors[i], this); } return externalConstructors; } private ExternalField[] buildFieldArray(Field[] fields) { ExternalField[] externalFields = new ExternalField[fields.length]; for (int i = fields.length; i-- > 0; ) { externalFields[i] = new CFExternalField(fields[i], this); } return externalFields; } private ExternalMethod[] buildMethodArray(Method[] methods) { ExternalMethod[] externalMethods = new ExternalMethod[methods.length]; for (int i = methods.length; i-- > 0; ) { externalMethods[i] = new CFExternalMethod(methods[i], this); } return externalMethods; } }