< prev index next >
src/java.xml.ws/share/classes/com/sun/xml/internal/ws/spi/db/BindingContextFactory.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 23,32 ****
--- 23,33 ----
* questions.
*/
package com.sun.xml.internal.ws.spi.db;
+ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
*** 154,174 ****
if (LOGGER.isLoggable(Level.FINE))
LOGGER.log(Level.FINE, "Using databindng: " + mode
+ " based on '" + JAXB_CONTEXT_FACTORY_PROPERTY
+ "' System property");
} else {
! // Find a default provider. Note we always ensure the list
! // is always non-empty.
! for (BindingContextFactory factory : factories()) {
! if (LOGGER.isLoggable(Level.FINE))
! LOGGER.log(Level.FINE,
! "Using SPI-determined databindng mode: "
! + factory.getClass().getName());
! // Special case: no name lookup used.
! return factory.newContext(bi);
! }
!
// Should never get here as the list is non-empty.
LOGGER.log(Level.SEVERE, "No Binding Context Factories found.");
throw new DatabindingException("No Binding Context Factories found.");
}
BindingContextFactory f = getFactory(mode);
--- 155,167 ----
if (LOGGER.isLoggable(Level.FINE))
LOGGER.log(Level.FINE, "Using databindng: " + mode
+ " based on '" + JAXB_CONTEXT_FACTORY_PROPERTY
+ "' System property");
} else {
! // Find a default provider. Note we always ensure the list is always non-empty.
! BindingContext factory = getBindingContextFromSpi(factories(), bi);
! if (factory != null) return factory;
// Should never get here as the list is non-empty.
LOGGER.log(Level.SEVERE, "No Binding Context Factories found.");
throw new DatabindingException("No Binding Context Factories found.");
}
BindingContextFactory f = getFactory(mode);
*** 176,185 ****
--- 169,234 ----
return f.newContext(bi);
LOGGER.severe("Unknown Databinding mode: " + mode);
throw new DatabindingException("Unknown Databinding mode: " + mode);
}
+ /**
+ * Creates JAXB bindingContext with one of the provided factories.
+ * To filter appropriate factory {@link BindingContextFactory#isFor(String)} method is used.
+ * Currently known 2 appropriate factories: JAXB RI and MOXY.
+ * In case no suitable factory is found we are trying to create context with any given factory.
+ *
+ * @param factories given collection of factories.
+ * @param bindingInfo will be used to create bindingContext.
+ * @return Created context or null. Null will be returned if we were not able to create context with any given factory.
+ */
+ private static BindingContext getBindingContextFromSpi(List<BindingContextFactory> factories, BindingInfo bindingInfo) {
+ List<BindingContextFactory> fallback = new ArrayList<BindingContextFactory>();
+ BindingContext result;
+ for (BindingContextFactory factory : factories) {
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Found SPI-determined databindng mode: " + factory.getClass().getName());
+ }
+ if (factory.isFor("org.eclipse.persistence.jaxb") || factory.isFor("com.sun.xml.internal.bind.v2.runtime")) { // filter (JAXB RI || MOXy) implementation
+ result = factory.newContext(bindingInfo);
+ if (result != null) {
+ return result;
+ }
+ } else {
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Skipped -> not JAXB.");
+ }
+ fallback.add(factory);
+ }
+ }
+ for (BindingContextFactory factory : fallback) {
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Fallback. Creating from: " + factory.getClass().getName());
+ }
+ result = getContextOrNullIfError(factory, bindingInfo);
+ if (result != null) {
+ return result;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Factory creates new context bases on provided bindingInfo.
+ * @param factory given factory.
+ * @param bindingInfo to be used to create context.
+ * @return Created context or null. Null will be returned if an error happened during the creation process.
+ */
+ private static BindingContext getContextOrNullIfError(BindingContextFactory factory, BindingInfo bindingInfo) {
+ try {
+ return factory.newContext(bindingInfo);
+ } catch (Exception e) {
+ LOGGER.log(Level.WARNING, e.getMessage(), e);
+ return null;
+ }
+ }
+
static public boolean isContextSupported(Object o) {
if (o == null) return false;
String pkgName = o.getClass().getPackage().getName();
for (BindingContextFactory f: factories()) if (f.isFor(pkgName)) return true;
return false;
*** 197,248 ****
* @deprecated - Does jaxws need this?
*/
static public BindingContext getBindingContext(Marshaller m) {
return getJAXBFactory(m).getContext(m);
}
-
- /**
- * Creates a new {@link BindingContext}.
- *
- * <p>
- * {@link JAXBContext#newInstance(Class[]) JAXBContext.newInstance()} methods may
- * return other JAXB providers that are not compatible with the JAX-RPC RI.
- * This method guarantees that the JAX-WS RI will finds the JAXB RI.
- *
- * @param classes
- * Classes to be bound. See {@link JAXBContext#newInstance(Class[])} for the meaning.
- * @param typeRefs
- * See {@link #TYPE_REFERENCES} for the meaning of this parameter.
- * Can be null.
- * @param subclassReplacements
- * See {@link #SUBCLASS_REPLACEMENTS} for the meaning of this parameter.
- * Can be null.
- * @param defaultNamespaceRemap
- * See {@link #DEFAULT_NAMESPACE_REMAP} for the meaning of this parameter.
- * Can be null (and should be null for ordinary use of JAXB.)
- * @param c14nSupport
- * See {@link #CANONICALIZATION_SUPPORT} for the meaning of this parameter.
- * @param ar
- * See {@link #ANNOTATION_READER} for the meaning of this parameter.
- * Can be null.
- * @since JAXB 2.1 EA2
- */
- // public static BindingContext newInstance(@NotNull Class[] classes,
- // @Nullable Collection<TypeInfo> typeRefs,
- // @Nullable Map<Class,Class> subclassReplacements,
- // @Nullable String defaultNamespaceRemap, boolean c14nSupport,
- // @Nullable RuntimeAnnotationReader ar) throws JAXBException {
- // return ContextFactory.createContext(classes, typeRefs, subclassReplacements,
- // defaultNamespaceRemap, c14nSupport, ar, false, false, false);
- // }
- //
- // /**
- // * @deprecated
- // * Compatibility with older versions.
- // */
- // public static BindingContext newInstance(@NotNull Class[] classes,
- // @Nullable Collection<TypeInfo> typeRefs,
- // @Nullable String defaultNamespaceRemap, boolean c14nSupport ) throws JAXBException {
- // return newInstance(classes,typeRefs, Collections.<Class,Class>emptyMap(),
- // defaultNamespaceRemap,c14nSupport,null);
- // }
}
--- 246,251 ----
< prev index next >