private void unloadCompositionPrograms(URI artifactURI, ResourceSet resourceSet) {
   for (List<String> ucpi :
       ReuseResources.INSTANCE.getInfluencedComposingCompositionProgramIDsFragment(
           ResourceUtil.idFrom(artifactURI).getSegments())) {
     URI cpURI = ResourceUtil.uriFrom(ResourceUtil.idFrom(ucpi));
     if (cpURI != null) {
       unload(cpURI, resourceSet);
     }
   }
 }
  private void computeAndCacheCompositionInterface(
      List<String> ufi,
      Resource fragmentResource,
      List<ReuseExtensionActivator> rexActivatorList,
      ResourceSet resourceSet,
      IndexMetaData metaData) {
    Fragment fragment = null;

    // physical or composed?
    List<Constraint> constraints =
        FacetUtil.buildConstraints(
            IndexConstants.COLUMN_COMPOSED_FRAGMENT, ResourceUtil.idString(ufi));
    FacetedRequest request = FacetUtil.buildFacetedRequest(constraints);
    List<IndexRow> response = IndexUtil.INSTANCE.getIndex(request);

    if (response.isEmpty()) {
      fragment = FragmentFactory.eINSTANCE.createPhysicalFragment();
    } else {
      fragment = FragmentFactory.eINSTANCE.createComposedFragment();
    }

    // load
    fragment.getUFI().addAll(ufi);
    fragment.getContents().addAll(fragmentResource.getContents());

    // find reuse extension activators
    for (ReuseExtensionActivator rexActivator : rexActivatorList) {
      if (rexActivator.getReuseExtension() instanceof ComponentModelSpecification) {
        if (influencesFragment(rexActivator, fragment)) {
          fragment.getComponentModelActivators().add(rexActivator);
        }
      }
    }

    // compute composition interface (post processors might need diagrams)
    if (!fragment.getContents().isEmpty()) {
      for (URI fragmentDiagramURI : ReuseResources.INSTANCE.getDiagramURIs(ufi)) {
        Resource fragmentDiagramResource = null;
        try {
          fragmentDiagramResource = resourceSet.getResource(fragmentDiagramURI, true);
        } catch (Exception e) {
          // ok
        }
        if (fragmentDiagramResource != null) {
          fragment.getDiagrams().addAll(fragmentDiagramResource.getContents());
        }
      }
    }
    CompositionInterfaceComputerUtil.compute(fragment);

    // index (cache)
    Resource tempXMIResource = resourceSet.createResource(URI.createURI("temp:/temp.xmi"));
    tempXMIResource.getContents().add(fragment);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {
      tempXMIResource.save(outputStream, resourceSet.getLoadOptions());
      metaData.putSingle(IndexConstants.COLUMN_FRAGMENT, outputStream.toString("UTF-8"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    resourceSet.getResources().remove(tempXMIResource);

    // are there external computers registered?
    // TODO #1656: test this
    DerivedCompositionProgram derivedCp = CompositionProgramExtractorUtil.extract(fragment);
    if (derivedCp != null && derivedCp.getUCPI() != null && !derivedCp.getUCPI().isEmpty()) {
      URI derivedCpURI =
          SokanReuseResourceUtil.getDerivedCompositionProgramURI(
              derivedCp.getUCPI(), fragment.getUFI(), null);
      Resource resource =
          createResourceForDerivedCompositionProgram(derivedCp, derivedCpURI, resourceSet);
      ReuseResourcesUtil.completeCompositionProgram(resource);
    }
  }