Esempio n. 1
0
  protected void marshalCollection(
      Class<?> originalCls,
      Object collection,
      Type genericType,
      String enc,
      OutputStream os,
      MediaType m,
      Annotation[] anns)
      throws Exception {

    Class<?> actualClass = InjectionUtils.getActualType(genericType);
    actualClass = getActualType(actualClass, genericType, anns);

    Collection<?> c =
        originalCls.isArray() ? Arrays.asList((Object[]) collection) : (Collection<?>) collection;

    Iterator<?> it = c.iterator();

    Object firstObj = it.hasNext() ? it.next() : null;

    QName qname = null;
    if (firstObj instanceof JAXBElement) {
      JAXBElement<?> el = (JAXBElement<?>) firstObj;
      qname = el.getName();
      actualClass = el.getDeclaredType();
    } else {
      qname = getCollectionWrapperQName(actualClass, genericType, firstObj, true);
    }
    if (qname == null) {
      String message =
          new org.apache.cxf.common.i18n.Message("NO_COLLECTION_ROOT", BUNDLE).toString();
      throw new WebApplicationException(Response.serverError().entity(message).build());
    }

    StringBuilder pi = new StringBuilder();
    pi.append(XML_PI_START + (enc == null ? "UTF-8" : enc) + "\"?>");
    os.write(pi.toString().getBytes());
    String startTag = null;
    String endTag = null;

    if (qname.getNamespaceURI().length() > 0) {
      String prefix = nsPrefixes.get(qname.getNamespaceURI());
      if (prefix == null) {
        prefix = "ns1";
      }
      startTag =
          "<"
              + prefix
              + ":"
              + qname.getLocalPart()
              + " xmlns:"
              + prefix
              + "=\""
              + qname.getNamespaceURI()
              + "\">";
      endTag = "</" + prefix + ":" + qname.getLocalPart() + ">";
    } else {
      startTag = "<" + qname.getLocalPart() + ">";
      endTag = "</" + qname.getLocalPart() + ">";
    }
    os.write(startTag.getBytes());
    if (firstObj != null) {
      XmlJavaTypeAdapter adapter =
          org.apache.cxf.jaxrs.utils.JAXBUtils.getAdapter(firstObj.getClass(), anns);
      marshalCollectionMember(
          JAXBUtils.useAdapter(firstObj, adapter, true),
          actualClass,
          genericType,
          enc,
          os,
          anns,
          m,
          qname.getNamespaceURI());
      while (it.hasNext()) {
        marshalCollectionMember(
            JAXBUtils.useAdapter(it.next(), adapter, true),
            actualClass,
            genericType,
            enc,
            os,
            anns,
            m,
            qname.getNamespaceURI());
      }
    }
    os.write(endTag.getBytes());
  }