viatra / EMF-IncQuery

This repository is only kept for historic reasons. All development happens on eclipse.org
http://eclipse.org/viatra
13 stars 4 forks source link

NPE in ITC UnionFind #339

Closed abelhegedus closed 11 years ago

abelhegedus commented 11 years ago

I have managed to create a minimal reproducible version of the following exception:

!MESSAGE EMF-IncQuery encountered an error in processing the EMF model. This happened while trying to handle the following update notification: org.eclipse.emf.ecore.impl.ENotificationImpl@487230 (eventType: SET, position: -1, notifier: cloud.impl.AppNodeImpl@17d661a6 (name: 2), feature: org.eclipse.emf.ecore.impl.EReferenceImpl@af55e77 (name: depends) (ordered: true, unique: true, lowerBound: 0, upperBound: 1) (changeable: true, volatile: false, transient: false, defaultValueLiteral: null, unsettable: false, derived: false) (containment: false, resolveProxies: true), oldValue: cloud.impl.AppNodeImpl@17d661a6 (name: 2), newValue: cloud.impl.AppNodeImpl@1f8f6f95 (name: 1), isTouch: false, wasSet: true)

!STACK 0
java.lang.NullPointerException
    at org.eclipse.viatra2.emf.incquery.base.itc.alg.incscc.UnionFind.deleteSet(UnionFind.java:163)
    at org.eclipse.viatra2.emf.incquery.base.itc.alg.incscc.IncSCCAlg.nodeDeleted(IncSCCAlg.java:346)
    at org.eclipse.viatra2.emf.incquery.base.itc.graphimpl.Graph.deleteNode(Graph.java:126)
    at org.eclipse.viatra2.gtasm.patternmatcher.incremental.rete.single.TransitiveClosureNode.update(TransitiveClosureNode.java:92)
    at org.eclipse.viatra2.gtasm.patternmatcher.incremental.rete.network.ReteContainer.messageConsumptionSingleThreaded(ReteContainer.java:489)
    at org.eclipse.viatra2.gtasm.patternmatcher.incremental.rete.network.Network.waitForReteTermination(Network.java:333)
    at org.eclipse.viatra2.gtasm.patternmatcher.incremental.rete.boundary.ReteBoundary.updateBinaryEdge(ReteBoundary.java:639)
    at org.eclipse.viatra2.emf.incquery.runtime.internal.BaseIndexListener.featureDeleted(BaseIndexListener.java:140)
    at org.eclipse.viatra2.emf.incquery.base.core.NavigationHelperContentAdapter.notifyFeatureListeners(NavigationHelperContentAdapter.java:559)
    at org.eclipse.viatra2.emf.incquery.base.core.NavigationHelperContentAdapter.removeFeatureTuple(NavigationHelperContentAdapter.java:445)
    at org.eclipse.viatra2.emf.incquery.base.core.NavigationHelperVisitor.visitReference(NavigationHelperVisitor.java:233)
    at org.eclipse.viatra2.emf.incquery.base.core.NavigationHelperVisitor.visitNonContainmentReference(NavigationHelperVisitor.java:224)
    at org.eclipse.viatra2.emf.incquery.base.comprehension.EMFModelComprehension.traverseFeatureInternal(EMFModelComprehension.java:215)
    at org.eclipse.viatra2.emf.incquery.base.comprehension.EMFModelComprehension.traverseFeatureInternalSimple(EMFModelComprehension.java:176)
    at org.eclipse.viatra2.emf.incquery.base.comprehension.EMFModelComprehension.traverseFeature(EMFModelComprehension.java:166)
    at org.eclipse.viatra2.emf.incquery.base.core.NavigationHelperContentAdapter.featureUpdate(NavigationHelperContentAdapter.java:183)
    at org.eclipse.viatra2.emf.incquery.base.core.NavigationHelperContentAdapter.notifyChanged(NavigationHelperContentAdapter.java:142)
    at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
    at cloud.impl.AppNodeImpl.setDepends(AppNodeImpl.java:97)

The example is the cloud model, so @szabta89 should have no problem trying it. The patterns required are:

import "http://org.eclipse.viatra2.emf.incquery.triggerengine.dse.cloud"

pattern dependantAppNodes(App1, App2) = {
    AppNode.depends(App1, App2);
}

pattern cyclicDependency(app) = {
    AppNode(app);
    find dependantAppNodes+(app, app);
}

The instance model should include 2 App nodes (App1, App2), reproduced with:

  1. App1 and App2 depends reference null
  2. set App1 -> depends -> App1 (creates cyclic dependency)
  3. set App1 ->depends -> App2 (removes cyclic dependency)
szabta89 commented 11 years ago

Fixed in master and cherry picked into maintenance branch.