private static XmlBindings getXmlBindings(Object metadata) {
   XmlBindings xmlBindings = null;
   Unmarshaller unmarshaller;
   // only create the JAXBContext for our XmlModel once
   JAXBContext jaxbContext = CompilerHelper.getXmlBindingsModelContext();
   try {
     unmarshaller = jaxbContext.createUnmarshaller();
     if (metadata instanceof File) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((File) metadata);
     } else if (metadata instanceof InputSource) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((InputSource) metadata);
     } else if (metadata instanceof BufferedInputStream) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((BufferedInputStream) metadata);
     } else if (metadata instanceof InputStream) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((InputStream) metadata);
     } else if (metadata instanceof Node) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((Node) metadata);
     } else if (metadata instanceof Reader) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((Reader) metadata);
     } else if (metadata instanceof Source) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((Source) metadata);
     } else if (metadata instanceof URL) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((URL) metadata);
     } else if (metadata instanceof XMLEventReader) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((XMLEventReader) metadata);
     } else if (metadata instanceof XMLStreamReader) {
       xmlBindings = (XmlBindings) unmarshaller.unmarshal((XMLStreamReader) metadata);
     } else if (metadata instanceof String) {
       if (((String) metadata).length() == 0) {
         throw org.eclipse.persistence.exceptions.JAXBException.unableToLoadMetadataFromLocation(
             (String) metadata);
       }
       URL url = null;
       try {
         url = new URL((String) metadata);
       } catch (MalformedURLException ex) {
         url = Thread.currentThread().getContextClassLoader().getResource((String) metadata);
       }
       if (url != null) {
         xmlBindings = (XmlBindings) unmarshaller.unmarshal(url);
       } else {
         // throw exception
         throw org.eclipse.persistence.exceptions.JAXBException.unableToLoadMetadataFromLocation(
             (String) metadata);
       }
     } else {
       throw org.eclipse.persistence.exceptions.JAXBException
           .incorrectValueParameterTypeForOxmXmlKey();
     }
   } catch (JAXBException jaxbEx) {
     throw org.eclipse.persistence.exceptions.JAXBException.couldNotUnmarshalMetadata(jaxbEx);
   }
   return xmlBindings;
 }
  private Map getPropertiesFromJSON() throws JAXBException {
    Map props = new HashMap(getProperties());

    if (props != null) {

      Object bindingFilesObject = props.get(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY);
      if (bindingFilesObject != null) {
        JAXBContext jaxbContext = CompilerHelper.getXmlBindingsModelContext();
        // unmarshal XML
        Unmarshaller u = jaxbContext.createUnmarshaller();
        Marshaller jsonMarshaller = jaxbContext.createMarshaller();
        // Marshal bindings to JSON (with no root)
        jsonMarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
        jsonMarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
        if (bindingFilesObject instanceof Map) {
          Map<String, Object> bindingFiles = (Map<String, Object>) bindingFilesObject;

          Iterator<String> keyIter = bindingFiles.keySet().iterator();
          while (keyIter.hasNext()) {
            String nextKey = keyIter.next();
            Object nextBindings = bindingFiles.get(nextKey);
            ;
            if (nextBindings instanceof List) {
              List nextList = (List) bindingFiles.get(nextKey);
              for (int i = 0; i < nextList.size(); i++) {
                Object o = nextList.get(i);
                if (o instanceof Source) {
                  Source nextSource = (Source) o;
                  if (nextSource instanceof StreamSource) {
                    StreamSource ss = (StreamSource) nextSource;
                    StreamSource ss2 = new StreamSource(ss.getInputStream());
                    Object unmarshalledFromXML = u.unmarshal(ss2);
                    StringWriter sw = new StringWriter();
                    StreamResult newResult = new StreamResult(sw);
                    jsonMarshaller.marshal(unmarshalledFromXML, newResult);
                    StreamSource newSource = new StreamSource(new StringReader(sw.toString()));
                    nextList.set(i, newSource);
                  }
                }
              }
            } else if (nextBindings instanceof Source) {
              Object unmarshalledFromXML = u.unmarshal((Source) nextBindings);

              StringWriter sw = new StringWriter();
              StreamResult newResult = new StreamResult(sw);
              jsonMarshaller.marshal(unmarshalledFromXML, newResult);
              StreamSource newSource = new StreamSource(new StringReader(sw.toString()));
              bindingFiles.put(nextKey, newSource);
            }
          }
        } else if (bindingFilesObject instanceof List) {
          List bindingFilesList = (List) bindingFilesObject;
          for (int i = 0; i < bindingFilesList.size(); i++) {
            Object next = bindingFilesList.get(i);
            Object unmarshalledFromXML = getXmlBindings(next);
            StringWriter sw = new StringWriter();
            StreamResult newResult = new StreamResult(sw);
            jsonMarshaller.marshal(unmarshalledFromXML, newResult);
            StreamSource newSource = new StreamSource(new StringReader(sw.toString()));
            bindingFilesList.set(i, newSource);
          }
          props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, bindingFilesList);
        } else {
          Object unmarshalledFromXML = getXmlBindings(bindingFilesObject);
          StringWriter sw = new StringWriter();
          StreamResult newResult = new StreamResult(sw);
          jsonMarshaller.marshal(unmarshalledFromXML, newResult);
          StreamSource newSource = new StreamSource(new StringReader(sw.toString()));
          props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, newSource);
        }
      }
    }
    return props;
  }