Пример #1
0
 private void addLinkToOLinks(List<OLink> olinks, Link link, RESTResource resource) {
   RequestContext requestContext = RequestContext.getRequestContext();
   assert (link != null);
   assert (link.getTransition() != null);
   Map<Transition, RESTResource> embeddedResources = resource.getEmbedded();
   String rel = link.getRel();
   String href = link.getHref();
   if (requestContext != null) {
     // Extract the transition fragment from the URI path
     href = link.getRelativeHref(getBaseUri(serviceDocument, uriInfo));
   }
   String title = link.getTitle();
   OLink olink = null;
   Transition linkTransition = link.getTransition();
   if (linkTransition != null) {
     if (embeddedResources != null
         && embeddedResources.get(linkTransition) != null
         && embeddedResources.get(linkTransition) instanceof EntityResource) {
       @SuppressWarnings("unchecked")
       EntityResource<OEntity> embeddedResource =
           (EntityResource<OEntity>) embeddedResources.get(linkTransition);
       // replace the OLink's on the embedded entity
       OEntity newEmbeddedEntity = processOEntity(embeddedResource);
       olink = OLinks.relatedEntityInline(rel, title, href, newEmbeddedEntity);
     } else if (embeddedResources != null
         && embeddedResources.get(linkTransition) != null
         && embeddedResources.get(linkTransition) instanceof CollectionResource) {
       @SuppressWarnings("unchecked")
       CollectionResource<OEntity> embeddedCollectionResource =
           (CollectionResource<OEntity>) embeddedResources.get(linkTransition);
       List<OEntity> entities = new ArrayList<OEntity>();
       for (EntityResource<OEntity> embeddedResource : embeddedCollectionResource.getEntities()) {
         // replace the OLink's on the embedded entity
         OEntity newEmbeddedEntity = processOEntity(embeddedResource);
         entities.add(newEmbeddedEntity);
       }
       olink = OLinks.relatedEntitiesInline(rel, title, href, entities);
     }
     if (olink == null) {
       if (linkTransition.getTarget() instanceof CollectionResourceState) {
         olink = OLinks.relatedEntities(rel, title, href);
       } else {
         olink = OLinks.relatedEntity(rel, title, href);
       }
     }
   }
   olinks.add(olink);
 }
  /**
   * @param uriInfo
   * @param links
   * @return
   */
  private String getAbsoluteId(UriInfo uriInfo, Collection<Link> links) {
    String absoluteId = "";

    for (Link link : links) {
      if ("self".equals(link.getRel())) {
        absoluteId = link.getHref();
        break;
      }
    }

    if (absoluteId.isEmpty()) {
      absoluteId = uriInfo.getBaseUri() + uriInfo.getPath();
    }

    return absoluteId;
  }
  protected void writeEntry(
      StreamWriter writer,
      String entityName,
      Entity entity,
      Collection<Link> entityLinks,
      Map<Transition, RESTResource> embeddedResources,
      String baseUri,
      String absoluteId,
      String updated) {
    assert (entityName != null);

    // entity name could be different between entity resource and underlying entity
    // e.g., for Errors entity, entity resource would have the request entity name
    String entityMetadataName = entity != null ? entity.getName() : entityName;

    EntityMetadata entityMetadata = metadata.getEntityMetadata(entityMetadataName);
    String modelName = metadata.getModelName();
    writer.writeId(absoluteId);
    OAtomEntity oae = getAtomInfo(entity);

    writer.writeTitle(oae.getAtomEntityTitle());
    String summary = oae.getAtomEntitySummary();
    if (!summary.isEmpty()) {
      writer.writeSummary(summary);
    }

    LocalDateTime updatedTime = oae.getAtomEntityUpdated();
    if (updatedTime != null) {
      updated = InternalUtil.toString(updatedTime.toDateTime(DateTimeZone.UTC));
    }

    writer.writeUpdated(updated);
    writer.writeAuthor(oae.getAtomEntityAuthor());

    if (entityLinks != null) {
      for (Link link : entityLinks) {
        String type =
            (link.getTransition().getTarget() instanceof CollectionResourceState)
                ? atom_feed_content_type
                : atom_entry_content_type;
        String href = link.getRelativeHref(baseUri);
        String rel = link.getRel();
        writer.startLink(href, rel);

        if ("self".equals(link.getRel())) {
          ResourceState target = link.getTransition().getTarget();
          writer.writeAttribute("profile", target.getRel());
        }

        if (!"self".equals(link.getRel()) && !"edit".equals(link.getRel())) {
          writer.writeAttribute("type", type);
        }
        writer.writeAttribute("title", link.getTitle());
        if (embeddedResources != null && embeddedResources.get(link.getTransition()) != null) {
          String embeddedAbsoluteId = link.getHref();
          writeLinkInline(
              writer,
              metadata,
              link,
              embeddedResources.get(link.getTransition()),
              link.getHref(),
              baseUri,
              embeddedAbsoluteId,
              updated);
        }
        String linkId = link.getLinkId();
        if (linkId != null && linkId.length() > 0) {
          writer.writeAttribute("id", linkId);
        }
        writer.endLink();
      }
    }

    writer.writeCategory(modelName + Metadata.MODEL_SUFFIX + "." + entityName, scheme);
    writer.flush();

    writer.startContent(MediaType.APPLICATION_XML);

    writer.startElement(new QName(m, "properties", "m"));
    if (entity != null) {
      writeProperties(writer, entityMetadata, entity.getProperties(), modelName);
    }
    writer.endElement();

    writer.endContent();
  }