/******************************************************************************* * Copyright (c) 2011, 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: * Rick Barkhouse - 2.2 - Initial implementation ******************************************************************************/ package org.eclipse.persistence.jaxb.javamodel.oxm; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.persistence.internal.oxm.XMLConversionManager; import org.eclipse.persistence.jaxb.javamodel.*; import org.eclipse.persistence.jaxb.javamodel.reflection.JavaAnnotationImpl; import org.eclipse.persistence.jaxb.xmlmodel.XmlRegistry; import org.eclipse.persistence.jaxb.xmlmodel.XmlRegistry.XmlElementDecl; /** * INTERNAL: * <p> * <b>Purpose:</b> Specialized <code>JavaClass</code> implementation wrapping * MOXy's <code>xmlmodel.XmlRegistry</code>, used to represent a JAXB * <code>ObjectFactory</code>. Used when bootstrapping a <code>DynamicJAXBContext</code> * from XML Bindings. * </p> * * <p> * <b>Responsibilities:</b> * </p> * <ul> * <li>Provide Class information to the <code>JavaModel</code>.</li> * </ul> * * @since EclipseLink 2.2 * * @see org.eclipse.persistence.jaxb.javamodel.JavaClass * @see org.eclipse.persistence.jaxb.javamodel.oxm.OXMJAXBElementImpl */ public class OXMObjectFactoryImpl implements JavaClass { private XmlRegistry registry; private JavaModel javaModel; private ArrayList<JavaMethod> methods = new ArrayList<JavaMethod>(); private ArrayList<JavaAnnotation> annotations = new ArrayList<JavaAnnotation>(); public OXMObjectFactoryImpl(XmlRegistry xmlRegistry) { this.registry = xmlRegistry; } public void init() { // Build annotations and methods List<XmlElementDecl> decls = this.registry.getXmlElementDecl(); for (Iterator<XmlElementDecl> iterator = decls.iterator(); iterator.hasNext();) { XmlElementDecl xmlElementDecl = (XmlElementDecl) iterator.next(); String paramType = xmlElementDecl.getType(); JavaClass jaxbElementClass = new OXMJAXBElementImpl(paramType, this.javaModel); methods.add(new OXMJavaMethodImpl(xmlElementDecl.getJavaMethod(), jaxbElementClass, this)); HashMap<String, Object> components = new HashMap<String, Object>(); components.put(NAME, xmlElementDecl.getName()); components.put(NAMESPACE, xmlElementDecl.getNamespace()); components.put(SUBSTITUTION_HEAD_NAME, xmlElementDecl.getSubstitutionHeadName()); components.put(SUBSTITUTION_HEAD_NAMESPACE, xmlElementDecl.getSubstitutionHeadNamespace()); Annotation anno = AnnotationProxy.getProxy(components, javax.xml.bind.annotation.XmlElementDecl.class, this.javaModel.getClassLoader(), XMLConversionManager.getDefaultManager()); annotations.add(new JavaAnnotationImpl(anno)); } } public Collection<JavaClass> getActualTypeArguments() { return new ArrayList<JavaClass>(); } public JavaClass getComponentType() { return null; } public JavaConstructor getConstructor(JavaClass[] parameterTypes) { return new OXMJavaConstructorImpl(this); } public Collection<JavaConstructor> getConstructors() { ArrayList<JavaConstructor> constructors = new ArrayList<JavaConstructor>(1); constructors.add(new OXMJavaConstructorImpl(this)); return constructors; } public Collection<JavaClass> getDeclaredClasses() { return new ArrayList<JavaClass>(); } public JavaConstructor getDeclaredConstructor(JavaClass[] parameterTypes) { return new OXMJavaConstructorImpl(this); } public Collection<JavaConstructor> getDeclaredConstructors() { ArrayList<JavaConstructor> constructors = new ArrayList<JavaConstructor>(1); constructors.add(new OXMJavaConstructorImpl(this)); return constructors; } public JavaField getDeclaredField(String arg0) { return null; } public Collection<JavaField> getDeclaredFields() { return null; } public JavaMethod getDeclaredMethod(String arg0, JavaClass[] arg1) { return null; } public Collection<JavaMethod> getDeclaredMethods() { return methods; } public JavaMethod getMethod(String arg0, JavaClass[] arg1) { return null; } public Collection<JavaMethod> getMethods() { return methods; } public int getModifiers() { return 0; } public String getName() { return getQualifiedName(); } public JavaPackage getPackage() { return new OXMJavaPackageImpl(getPackageName()); } public String getPackageName() { int lastDotIndex = getQualifiedName().lastIndexOf(DOT); if (lastDotIndex == -1) { return EMPTY_STRING; } return getQualifiedName().substring(0, lastDotIndex); } public String getQualifiedName() { return this.registry.getName(); } public String getRawName() { return getQualifiedName(); } public JavaClass getSuperclass() { return this.javaModel.getClass(JAVA_LANG_OBJECT); } public Type[] getGenericInterfaces() { return new Type[0]; } public Type getGenericSuperclass() { return null; } public boolean hasActualTypeArguments() { return false; } public boolean isAbstract() { return false; } public boolean isAnnotation() { return false; } public boolean isArray() { return false; } public boolean isAssignableFrom(JavaClass arg0) { return false; } public boolean isEnum() { return false; } public boolean isFinal() { return false; } public boolean isInterface() { return false; } public boolean isMemberClass() { return false; } public boolean isPrimitive() { return false; } public boolean isPrivate() { return false; } public boolean isProtected() { return false; } public boolean isPublic() { return true; } public boolean isStatic() { return false; } public boolean isSynthetic() { return false; } @Override public JavaClassInstanceOf instanceOf() { return JavaClassInstanceOf.OXM_OBJECT_FACTORY_IMPL; } public JavaAnnotation getAnnotation(JavaClass arg0) { return null; } public Collection<JavaAnnotation> getAnnotations() { return null; } public JavaAnnotation getDeclaredAnnotation(JavaClass arg0) { return null; } public Collection<JavaAnnotation> getDeclaredAnnotations() { return null; } public JavaModel getJavaModel() { return javaModel; } public void setJavaModel(JavaModel javaModel) { this.javaModel = javaModel; } private static String EMPTY_STRING = ""; private static String DOT = "."; private static String JAVA_LANG_OBJECT = "java.lang.Object"; private static String NAME = "name"; private static String NAMESPACE = "namespace"; private static String SUBSTITUTION_HEAD_NAME = "substitutionHeadName"; private static String SUBSTITUTION_HEAD_NAMESPACE = "substitutionHeadNamespace"; }