/* * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package com.sun.tools.internal.xjc.runtime; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; /** * This class implements the actual logic of {@link JAXBContext#newInstance}. * *
* This class works as a facade and all the actual work is delegated to * a JAXB provider that happens to be in the runtime (not necessarily the JAXB RI.) * This allows the generated code to be run with any JAXB provider. * *
* This code is only used when XJC generates interfaces/implementations. * *
* The trick to make this work is two ObjectFactory classes that we generate * in the interface/implementation mode. * *
* The public ObjectFactory follows the spec, and this is the one that's exposed * to users. The public ObjectFactory refers to interfaces, so they aren't * directly usable by a JAXB 2.0 implementation. * *
* The private one lives in the impl package, and this one is indistinguishable * from the ObjectFactory that we generate for the value class generation mode. * This private ObjectFactory refers to implementation classes, which are * also indistinguishable from value classes that JAXB generates. * *
* All in all, the private ObjectFactory plus implementation classes give * a JAXB provider an illusion that they are dealing with value classes * that happens to implement some interfaces. * *
* In this way, the JAXB RI can provide the portability even for the
* interface/implementation generation mode.
*
* @since 2.0
* @author Kohsuke Kawaguchi
*/
public class JAXBContextFactory {
private static final String DOT_OBJECT_FACTORY = ".ObjectFactory";
private static final String IMPL_DOT_OBJECT_FACTORY = ".impl.ObjectFactory";
/**
* The JAXB API will invoke this method via reflection
*/
public static JAXBContext createContext( Class[] classes, Map properties ) throws JAXBException {
Class[] r = new Class[classes.length];
boolean modified = false;
// find any reference to our 'public' ObjectFactory and
// replace that to our 'private' ObjectFactory.
for( int i=0; i