Java 类org.eclipse.emf.ecore.util.EcoreUtil.UsageCrossReferencer 实例源码

项目:emfstore-rest    文件:IdEObjectCollectionImpl.java   
/**
 * 
 * {@inheritDoc}
 * 
 * @see org.eclipse.emf.emfstore.internal.common.model.IdEObjectCollection#deleteModelElement(org.eclipse.emf.ecore.EObject)
 */
public void deleteModelElement(final EObject modelElement) {
    if (!this.contains(modelElement)) {
        throw new IllegalArgumentException("Cannot delete a model element that is not contained in this project.");
    }

    // remove cross references
    ModelUtil.deleteOutgoingCrossReferences(this, modelElement);
    final Collection<Setting> crossReferences = UsageCrossReferencer.find(modelElement, this);
    ModelUtil.deleteIncomingCrossReferencesFromParent(crossReferences, modelElement);

    // remove containment
    final EObject containerModelElement = ModelUtil.getContainerModelElement(modelElement);
    if (containerModelElement == null) {
        // removeModelElementAndChildrenFromCache(modelElement);
        // getEobjectsIdMap().remove(modelElement);
        getModelElements().remove(modelElement);
    } else {
        final EReference containmentFeature = modelElement.eContainmentFeature();
        if (containmentFeature.isMany()) {
            final EList<?> containmentList = (EList<?>) containerModelElement.eGet(containmentFeature);
            containmentList.remove(modelElement);
        } else {
            containerModelElement.eSet(containmentFeature, null);
        }

        removeModelElementAndChildrenFromResource(modelElement);
    }
}
项目:anatlyzer    文件:EMFHandler.java   
public void replaceBy(EObject oldObject, EObject newObject) {
    EObject eObject = oldObject;
    // Copied from EcoreUtil#delete
    EObject rootEObject = EcoreUtil.getRootContainer(eObject);
    Resource resource = rootEObject.eResource();

    Collection<EStructuralFeature.Setting> usages;
    if (resource == null)
    {
      usages = UsageCrossReferencer.find(eObject, rootEObject);
    }
    else
    {
      ResourceSet resourceSet = resource.getResourceSet();
      if (resourceSet == null)
      {
        usages = UsageCrossReferencer.find(eObject, resource);
      }
      else
      {
        usages = UsageCrossReferencer.find(eObject, resourceSet);
      }
    }

    for (EStructuralFeature.Setting setting : usages)
    {
      if (setting.getEStructuralFeature().isChangeable())
      {
          EObject holder = setting.getEObject();
          EStructuralFeature f = setting.getEStructuralFeature();
          if ( f.isMany() ) {
              EList<EObject> list = (EList<EObject>) holder.eGet(f);
              list.set(list.indexOf(oldObject), newObject);
          } else {
              holder.eSet(f, newObject);
          }
      }
    }


    EcoreUtil.replace(oldObject, newObject);
    allCreatedObjectsIntoResource.remove(oldObject);
}
项目:Environment    文件:OverviewSpecificationUtil.java   
/**
 *
 * Recursively count all "external" references.
 * 
 * @param rootDesc Descriptor in question.
 * @param desc Descriptor used for recursion. It must be equal to @rootDesc. 
 */
private static synchronized boolean isDescriptorReferencedElsewhere(Descriptor rootDesc, Descriptor desc){
    //remove descriptor only if it is not referenced elsewhere
    //TODO: check if it works as expected
    EObject root = EcoreUtil.getRootContainer(desc);

    int descriptroRefCounter = 0;
    for(Object object : UsageCrossReferencer.find(desc, root)){

        //check if reference is marked for release
        boolean isInsideRoot = false;
        if(object instanceof EObject){
            EObject ref = (EObject)object;
            while(ref != null){
                if(ref == rootDesc){
                    isInsideRoot = true;
                    break;
                }
                ref = ref.eContainer(); 
            }
        }

        if(!isInsideRoot){
            descriptroRefCounter++;
        }
    }

    if(descriptroRefCounter > 1){
        return true;
    }

    for(EObject child : desc.eContents()){
        if(child instanceof Descriptor){
            if(isDescriptorReferencedElsewhere(rootDesc, (Descriptor)child)){
                return true;
            }
        }
    }

    return false;
}
项目:eclectic    文件:EMFHandler.java   
public void replaceBy(EObject oldObject, EObject newObject) {
    EObject eObject = oldObject;
    // Copied from EcoreUtil#delete
    EObject rootEObject = EcoreUtil.getRootContainer(eObject);
    Resource resource = rootEObject.eResource();

    Collection<EStructuralFeature.Setting> usages;
    if (resource == null)
    {
      usages = UsageCrossReferencer.find(eObject, rootEObject);
    }
    else
    {
      ResourceSet resourceSet = resource.getResourceSet();
      if (resourceSet == null)
      {
        usages = UsageCrossReferencer.find(eObject, resource);
      }
      else
      {
        usages = UsageCrossReferencer.find(eObject, resourceSet);
      }
    }

    for (EStructuralFeature.Setting setting : usages)
    {
      if (setting.getEStructuralFeature().isChangeable())
      {
          EObject holder = setting.getEObject();
          EStructuralFeature f = setting.getEStructuralFeature();
          if ( f.isMany() ) {
              EList<EObject> list = (EList<EObject>) holder.eGet(f);
              list.set(list.indexOf(oldObject), newObject);
          } else {
              holder.eSet(f, newObject);
          }
      }
    }


    EcoreUtil.replace(oldObject, newObject);
    allCreatedObjectsIntoResource.remove(oldObject);
}
项目:emfstore-rest    文件:ProjectSpaceBase.java   
/**
 * Returns the {@link ECrossReferenceAdapter}, if available.
 * 
 * @param modelElement
 *            the model element for which to find inverse cross references
 * 
 * @return the {@link ECrossReferenceAdapter}
 */
public Collection<Setting> findInverseCrossReferences(EObject modelElement) {
    if (crossReferenceAdapter != null) {
        return crossReferenceAdapter.getInverseReferences(modelElement);
    }

    return UsageCrossReferencer.find(modelElement, resourceSet);
}