/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Emil Ong
*/
package com.caucho.jaxb;
import java.lang.reflect.*;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
import com.caucho.jaxb.skeleton.*;
public class ObjectFactorySkeleton {
private JAXBContextImpl _context;
private Object _objectFactory;
//private HashMap<QName,Skeleton> _roots = new HashMap<QName,Skeleton>();
private HashMap<QName,Method> _roots = new HashMap<QName,Method>();
private HashMap<Class,ClassSkeleton> _classSkeletons
= new HashMap<Class,ClassSkeleton>();
public ObjectFactorySkeleton(JAXBContextImpl context,
Class objectFactoryClass)
throws JAXBException
{
_context = context;
try {
_objectFactory = objectFactoryClass.newInstance();
}
catch (Exception e) {
throw new JAXBException(e);
}
String namespace = null;
Package pkg = objectFactoryClass.getPackage();
if (pkg.isAnnotationPresent(XmlSchema.class)) {
XmlSchema schema = (XmlSchema) pkg.getAnnotation(XmlSchema.class);
if (! "".equals(schema.namespace()))
namespace = schema.namespace();
}
Method[] methods = objectFactoryClass.getMethods();
for (Method method : methods) {
if (method.getName().startsWith("create")) {
XmlElementDecl decl = method.getAnnotation(XmlElementDecl.class);
Class cl = method.getReturnType();
if (cl.equals(JAXBElement.class)) {
ParameterizedType type =
(ParameterizedType) method.getGenericReturnType();
cl = (Class) type.getActualTypeArguments()[0];
}
if (decl != null) {
String localName = decl.name();
if (! "##default".equals(decl.namespace()))
namespace = decl.namespace();
QName root = null;
if (namespace == null)
root = new QName(localName);
else
root = new QName(localName, namespace);
_roots.put(root, method);
}
else {
if (! _context.hasSkeleton(cl)) {
ClassSkeleton skeleton = new ClassSkeleton(_context, cl);
_classSkeletons.put(cl, skeleton);
}
}
}
else if (method.getName().equals("newInstance")) {
// XXX
}
else if (method.getName().equals("getProperty")) {
// XXX
}
else if (method.getName().equals("setProperty")) {
// XXX
}
}
}
}