public static final ServiceEndpointMethodMapping _read(
      final XoXMLStreamReader reader, RuntimeContext context) throws Exception {

    // Check for xsi:nil
    if (reader.isXsiNil()) {
      return null;
    }

    if (context == null) {
      context = new RuntimeContext();
    }

    final ServiceEndpointMethodMapping serviceEndpointMethodMapping =
        new ServiceEndpointMethodMapping();
    context.beforeUnmarshal(serviceEndpointMethodMapping, LifecycleCallback.NONE);

    List<MethodParamPartsMapping> methodParamPartsMapping = null;

    // Check xsi:type
    final QName xsiType = reader.getXsiType();
    if (xsiType != null) {
      if (("service-endpoint-method-mappingType" != xsiType.getLocalPart())
          || ("http://java.sun.com/xml/ns/javaee" != xsiType.getNamespaceURI())) {
        return context.unexpectedXsiType(reader, ServiceEndpointMethodMapping.class);
      }
    }

    // Read attributes
    for (final Attribute attribute : reader.getAttributes()) {
      if (("id" == attribute.getLocalName())
          && (("" == attribute.getNamespace()) || (attribute.getNamespace() == null))) {
        // ATTRIBUTE: id
        final String id = Adapters.collapsedStringAdapterAdapter.unmarshal(attribute.getValue());
        context.addXmlId(reader, id, serviceEndpointMethodMapping);
        serviceEndpointMethodMapping.id = id;
      } else if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI != attribute.getNamespace()) {
        context.unexpectedAttribute(attribute, new QName("", "id"));
      }
    }

    // Read elements
    for (final XoXMLStreamReader elementReader : reader.getChildElements()) {
      if (("java-method-name" == elementReader.getLocalName())
          && ("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) {
        // ELEMENT: javaMethodName
        final String javaMethodNameRaw = elementReader.getElementAsString();

        final String javaMethodName;
        try {
          javaMethodName = Adapters.collapsedStringAdapterAdapter.unmarshal(javaMethodNameRaw);
        } catch (final Exception e) {
          context.xmlAdapterError(
              elementReader, CollapsedStringAdapter.class, String.class, String.class, e);
          continue;
        }

        serviceEndpointMethodMapping.javaMethodName = javaMethodName;
      } else if (("wsdl-operation" == elementReader.getLocalName())
          && ("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) {
        // ELEMENT: wsdlOperation
        final String wsdlOperationRaw = elementReader.getElementAsString();

        final String wsdlOperation;
        try {
          wsdlOperation = Adapters.collapsedStringAdapterAdapter.unmarshal(wsdlOperationRaw);
        } catch (final Exception e) {
          context.xmlAdapterError(
              elementReader, CollapsedStringAdapter.class, String.class, String.class, e);
          continue;
        }

        serviceEndpointMethodMapping.wsdlOperation = wsdlOperation;
      } else if (("wrapped-element" == elementReader.getLocalName())
          && ("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) {
        // ELEMENT: wrappedElement
        final Element wrappedElement = elementReader.getElementAsDomElement();
        serviceEndpointMethodMapping.wrappedElement = wrappedElement;
      } else if (("method-param-parts-mapping" == elementReader.getLocalName())
          && ("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) {
        // ELEMENT: methodParamPartsMapping
        final MethodParamPartsMapping methodParamPartsMappingItem =
            readMethodParamPartsMapping(elementReader, context);
        if (methodParamPartsMapping == null) {
          methodParamPartsMapping = serviceEndpointMethodMapping.methodParamPartsMapping;
          if (methodParamPartsMapping != null) {
            methodParamPartsMapping.clear();
          } else {
            methodParamPartsMapping = new ArrayList<MethodParamPartsMapping>();
          }
        }
        methodParamPartsMapping.add(methodParamPartsMappingItem);
      } else if (("wsdl-return-value-mapping" == elementReader.getLocalName())
          && ("http://java.sun.com/xml/ns/javaee" == elementReader.getNamespaceURI())) {
        // ELEMENT: wsdlReturnValueMapping
        final WsdlReturnValueMapping wsdlReturnValueMapping =
            readWsdlReturnValueMapping(elementReader, context);
        serviceEndpointMethodMapping.wsdlReturnValueMapping = wsdlReturnValueMapping;
      } else {
        context.unexpectedElement(
            elementReader,
            new QName("http://java.sun.com/xml/ns/javaee", "java-method-name"),
            new QName("http://java.sun.com/xml/ns/javaee", "wsdl-operation"),
            new QName("http://java.sun.com/xml/ns/javaee", "wrapped-element"),
            new QName("http://java.sun.com/xml/ns/javaee", "method-param-parts-mapping"),
            new QName("http://java.sun.com/xml/ns/javaee", "wsdl-return-value-mapping"));
      }
    }
    if (methodParamPartsMapping != null) {
      serviceEndpointMethodMapping.methodParamPartsMapping = methodParamPartsMapping;
    }

    context.afterUnmarshal(serviceEndpointMethodMapping, LifecycleCallback.NONE);

    return serviceEndpointMethodMapping;
  }