public void marshal(Object object, XMLStreamWriter streamWriter, TypeMappingInfo type)
      throws JAXBException {
    if (jaxbContext.getTypeMappingInfoToGeneratedType() == null) {
      marshal(object, streamWriter);
    } else {
      JAXBElement element = null;
      Object value = object;
      if (object instanceof JAXBElement) {
        // use the JAXBElement's properties to populate an XMLRoot
        element = (JAXBElement) object;
        value = element.getValue();
      }
      if (jaxbContext.getTypeMappingInfoToJavaTypeAdapters().size() > 0) {
        RootLevelXmlAdapter adapter = jaxbContext.getTypeMappingInfoToJavaTypeAdapters().get(type);
        if (adapter != null) {
          try {
            value = adapter.getXmlAdapter().marshal(value);
          } catch (Exception ex) {
            throw new JAXBException(XMLMarshalException.marshalException(ex));
          }
        }
      }

      value = wrapObject(value, element, type);
      marshal(value, streamWriter);
    }
  }