public InputStream addOrReplaceEntity()

in fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java [177:299]


  public InputStream addOrReplaceEntity(
      final String key,
      final String entitySetName,
      final InputStream is,
      final Entity entry) throws Exception {

    final ByteArrayOutputStream bos = new ByteArrayOutputStream();
    IOUtils.copy(is, bos);
    IOUtils.closeQuietly(is);

    final Map<String, NavigationProperty> navigationProperties = metadata.getNavigationProperties(entitySetName);

    // -----------------------------------------
    // 0. Retrieve navigation links to be kept
    // -----------------------------------------
    Set<String> linksToBeKept;
    try {
      linksToBeKept = new HashSet<String>(navigationProperties.keySet());
    } catch (NullPointerException e) {
      linksToBeKept = Collections.<String> emptySet();
    }

    for (String availableLink : new HashSet<String>(linksToBeKept)) {
      try {
        fsManager.resolve(Commons.getLinksPath(entitySetName, key, availableLink, Accept.JSON_FULLMETA));
      } catch (Exception e) {
        linksToBeKept.remove(availableLink);
      }
    }

    for (String linkName : retrieveAllLinkNames(new ByteArrayInputStream(bos.toByteArray()))) {
      linksToBeKept.remove(linkName);
    }
    // -----------------------------------------

    // -----------------------------------------
    // 1. Get default entry key and path (N.B. operation will consume/close the stream; use a copy instead)
    // -----------------------------------------
    final String entityKey = key == null ? getDefaultEntryKey(entitySetName, entry) : key;

    final String path = Commons.getEntityBasePath(entitySetName, entityKey);
    // -----------------------------------------

    // -----------------------------------------
    // 2. Retrieve navigation info
    // -----------------------------------------
    final NavigationLinks links = retrieveNavigationInfo(entitySetName, new ByteArrayInputStream(bos.toByteArray()));
    // -----------------------------------------

    // -----------------------------------------
    // 3. Normalize navigation info; add edit link; ... and save entity ....
    // -----------------------------------------
    final InputStream createdEntity = saveSingleEntity(
        entityKey, entitySetName, new ByteArrayInputStream(bos.toByteArray()), links);
    // -----------------------------------------

    bos.reset();
    IOUtils.copy(createdEntity, bos);

    // -----------------------------------------
    // 4. Add navigation links to be kept
    // -----------------------------------------
    final InputStream normalizedEntity =
        addLinks(entitySetName, entityKey, new ByteArrayInputStream(bos.toByteArray()), linksToBeKept);
    // -----------------------------------------

    IOUtils.closeQuietly(bos);

    // -----------------------------------------
    // 5. save the entity
    // -----------------------------------------
    final FileObject fo = fsManager.putInMemory(
        normalizedEntity,
        fsManager.getAbsolutePath(path + Constants.get(ConstantKey.ENTITY), getDefaultFormat()));
    // -----------------------------------------

    // -----------------------------------------
    // 4. Create links file and provided inlines
    // -----------------------------------------
    for (Map.Entry<String, List<String>> link : links.getLinks()) {
      putLinksInMemory(path, entitySetName, entityKey, link.getKey(), link.getValue());
    }

    final List<String> hrefs = new ArrayList<String>();

    for (final Link link : entry.getNavigationLinks()) {
      final NavigationProperty navProp =
          navigationProperties == null ? null : navigationProperties.get(link.getTitle());
      if (navProp != null) {
        final String inlineEntitySetName = navProp.getTarget();
        if (link.getInlineEntity() != null) {
          final String inlineEntryKey = getDefaultEntryKey(inlineEntitySetName, link.getInlineEntity());

          addOrReplaceEntity(
              inlineEntryKey,
              inlineEntitySetName,
              toInputStream(link.getInlineEntity()),
              link.getInlineEntity());

          hrefs.add(inlineEntitySetName + "(" + inlineEntryKey + ")");
        } else if (link.getInlineEntitySet() != null) {
          for (Entity subentry : link.getInlineEntitySet().getEntities()) {
            final String inlineEntryKey = getDefaultEntryKey(inlineEntitySetName, subentry);

            addOrReplaceEntity(
                inlineEntryKey,
                inlineEntitySetName,
                toInputStream(subentry),
                subentry);

            hrefs.add(inlineEntitySetName + "(" + inlineEntryKey + ")");
          }
        }

        if (!hrefs.isEmpty()) {
          putLinksInMemory(path, entitySetName, entityKey, link.getTitle(), hrefs);
        }
      }
    }
    // -----------------------------------------

    return fo.getContent().getInputStream();
  }