protected Response getEntityInternal()

in fit/src/main/java/org/apache/olingo/fit/Services.java [957:1063]


  protected Response getEntityInternal(
      final String location,
      final String accept,
      final String entitySetName,
      final String entityId,
      final String format,
      final String expand,
      final String select) {

    try {
      final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);

      if (utils.getKey() == Accept.XML || utils.getKey() == Accept.TEXT) {
        throw new UnsupportedMediaTypeException("Unsupported media type");
      }

      final Map.Entry<String, InputStream> entityInfo =
          utils.getValue().readEntity(entitySetName, entityId, Accept.ATOM);

      final InputStream entity = entityInfo.getValue();

      ResWrap<Entity> container = atomDeserializer.toEntity(entity);
      if (container.getContextURL() == null) {
        container = new ResWrap<Entity>(URI.create(Constants.get(ConstantKey.ODATA_METADATA_PREFIX)
            + entitySetName + Constants.get(ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
            container.getMetadataETag(), container.getPayload());
      }
      final Entity entry = container.getPayload();

      if ((this instanceof KeyAsSegment)) {
        final Link editLink = new Link();
        editLink.setRel("edit");
        editLink.setTitle(entitySetName);
        editLink.setHref(Constants.get(ConstantKey.DEFAULT_SERVICE_URL) + entitySetName + "/" + entityId);

        entry.setEditLink(editLink);
      }

      if (StringUtils.isNotBlank(select)) {
        final List<String> properties = Arrays.asList(select.split(","));
        final Set<Property> toBeRemoved = new HashSet<Property>();

        for (Property property : entry.getProperties()) {
          if (!properties.contains(property.getName())) {
            toBeRemoved.add(property);
          }
        }

        entry.getProperties().removeAll(toBeRemoved);

        final Set<Link> linkToBeRemoved = new HashSet<Link>();

        for (Link link : entry.getNavigationLinks()) {
          if (!properties.contains(link.getTitle().replaceAll("@.*$", "")) && !properties.contains(link.getTitle())) {
            linkToBeRemoved.add(link);
          }
        }

        entry.getNavigationLinks().removeAll(linkToBeRemoved);
      }

      String tempExpand = expand;
      if (StringUtils.isNotBlank(tempExpand)) {
        tempExpand = StringUtils.substringBefore(tempExpand, "(");
        final List<String> links = Arrays.asList(tempExpand.split(","));

        final Map<Link, Link> replace = new HashMap<Link, Link>();

        for (Link link : entry.getNavigationLinks()) {
          if (links.contains(link.getTitle())) {
            // expand link
            final Link rep = new Link();
            rep.setHref(link.getHref());
            rep.setRel(link.getRel());
            rep.setTitle(link.getTitle());
            rep.setType(link.getType());
            if (link.getType().equals(Constants.get(ConstantKey.ATOM_LINK_ENTRY))) {
              // inline entry
              final Entity inline = atomDeserializer.toEntity(
                  xml.expandEntity(entitySetName, entityId, link.getTitle())).getPayload();
              rep.setInlineEntity(inline);
            } else if (link.getType().equals(Constants.get(ConstantKey.ATOM_LINK_FEED))) {
              // inline feed
              final EntityCollection inline = atomDeserializer.toEntitySet(
                  xml.expandEntity(entitySetName, entityId, link.getTitle())).getPayload();
              rep.setInlineEntitySet(inline);
            }
            replace.put(link, rep);
          }
        }

        for (Map.Entry<Link, Link> link : replace.entrySet()) {
          entry.getNavigationLinks().remove(link.getKey());
          entry.getNavigationLinks().add(link.getValue());
        }
      }

      return xml.createResponse(
          location,
          xml.writeEntity(utils.getKey(), container),
          Commons.getETag(entityInfo.getKey()),
          utils.getKey());
    } catch (Exception e) {
      LOG.error("Error retrieving entity", e);
      return xml.createFaultResponse(accept, e);
    }
  }