You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2011/08/16 10:26:50 UTC

svn commit: r1158150 - in /incubator/jena/Jena2/ARQ/trunk: src-test/org/openjena/riot/lang/ src/org/openjena/atlas/event/ src/org/openjena/riot/ src/org/openjena/riot/lang/

Author: andy
Date: Tue Aug 16 08:26:50 2011
New Revision: 1158150

URL: http://svn.apache.org/viewvc?rev=1158150&view=rev
Log:
Memory leak in SinkTripleToGraph - event listener not being unregistered.

Removed:
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkToGraph.java
Modified:
    incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangNQuads.java
    incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTrig.java
    incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTurtle.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/event/EventManager.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/RiotLoader.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/WebReader.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkQuadsToDataset.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkTriplesToGraph.java

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangNQuads.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangNQuads.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangNQuads.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangNQuads.java Tue Aug 16 08:26:50 2011
@@ -76,7 +76,9 @@ public class TestLangNQuads extends Test
     {
         DatasetGraph dsg = DatasetLib.createDatasetGraphMem() ;
         Sink<Quad> sink = RiotLoader.datasetSink(dsg) ;
-        parse(sink, string) ;
+        try {
+            parse(sink, string) ;
+        } finally { sink.close() ; }
         return dsg ;
     }
     
@@ -100,7 +102,6 @@ public class TestLangNQuads extends Test
         parser.setProfile(RiotLib.profile(null, false, true, new ErrorHandlerEx())) ;
         parser.parse() ;
     }
-
 }
 
 /*

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTrig.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTrig.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTrig.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTrig.java Tue Aug 16 08:26:50 2011
@@ -80,7 +80,9 @@ public class TestLangTrig extends BaseTe
         Tokenizer tokenizer = TokenizerFactory.makeTokenizerString(string) ;
         LangTriG parser = RiotReader.createParserTriG(tokenizer, "http://base/", sink) ;
         parser.getProfile().setHandler(new ErrorHandlerEx()) ;
-        parser.parse();
+        try {
+            parser.parse();
+        } finally { sink.close() ; }
         return dsg ;
     }
     

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTurtle.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTurtle.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTurtle.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/lang/TestLangTurtle.java Tue Aug 16 08:26:50 2011
@@ -99,7 +99,9 @@ public class TestLangTurtle extends Base
         
         LangTurtle parser = RiotReader.createParserTurtle(tokenizer, "http://base/", sink) ;
         parser.getProfile().setHandler(new ErrorHandlerEx()) ;
-        parser.parse() ;
+        try {
+            parser.parse() ; 
+        } finally { sink.close() ; }
         return graph ;
     }
     

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/event/EventManager.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/event/EventManager.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/event/EventManager.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/event/EventManager.java Tue Aug 16 08:26:50 2011
@@ -36,6 +36,7 @@ public class EventManager
     // ---- The object EventManager itself
     
     // There are 2 event sets: one for specific objects and one for general event types (no object)  
+    // MultipMap.MultiMapToList
     private Map<Object, Map<EventType, List<EventListener>>> listenersByObject = new HashMap<Object, Map<EventType, List<EventListener>>>() ;
     private Map<EventType, List<EventListener>> listenersAllObjects = new HashMap<EventType, List<EventListener>>() ;
 
@@ -44,7 +45,6 @@ public class EventManager
     
     private void register$(Object object, EventType type, EventListener listener) 
     {
-        
         Map<EventType, List<EventListener>> x = get(object) ;
         if ( x == null )
         {

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/RiotLoader.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/RiotLoader.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/RiotLoader.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/RiotLoader.java Tue Aug 16 08:26:50 2011
@@ -63,8 +63,9 @@ public class RiotLoader
         Tokenizer tokenizer = TokenizerFactory.makeTokenizerString(string) ;
 
         LangRIOT parser = RiotReader.createParserQuads(tokenizer, language, baseURI, sink) ;
-        parser.parse() ;
-        sink.flush();
+        try {  
+            parser.parse() ;
+        } finally { sink.close() ; }
         return dsg;
     }
 
@@ -97,8 +98,9 @@ public class RiotLoader
         Sink<Triple> sink = graphSink(g) ;
         Tokenizer tokenizer = TokenizerFactory.makeTokenizerString(string) ;
         LangRIOT parser = RiotReader.createParserTriples(tokenizer, language, baseURI, sink) ;
-        parser.parse() ;
-        sink.flush();
+        try {
+            parser.parse() ;
+        } finally { sink.close() ; }
         return g ;
     }
     
@@ -135,12 +137,16 @@ public class RiotLoader
         if ( language.isQuads() )
         {
             Sink<Quad> sink = datasetSink(dataset) ;
-            readQuads(input, language, baseURI, sink) ;
+            try {
+                readQuads(input, language, baseURI, sink) ;
+            } finally { sink.close() ; }
         }
         else
         {
             Sink<Triple> sink = graphSink(dataset.getDefaultGraph()) ;
-            readTriples(input, language, baseURI, sink) ;
+            try {
+                readTriples(input, language, baseURI, sink) ;
+            } finally { sink.close() ; }
         }
     }
     
@@ -172,7 +178,9 @@ public class RiotLoader
     public static void read(InputStream input, Graph graph, Lang lang, String baseURI)
     {
         Sink<Triple> sink = graphSink(graph) ;
-        readTriples(input, lang, baseURI, sink) ;
+        try {
+            readTriples(input, lang, baseURI, sink) ;
+        } finally { sink.close() ; }
     }
 
     /** Parse an input stream and send the quads to the sink */ 

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/WebReader.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/WebReader.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/WebReader.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/WebReader.java Tue Aug 16 08:26:50 2011
@@ -56,7 +56,9 @@ public class WebReader
             throw new RiotException("Can't determine the syntax of <"+uri+"> (media type="+typedInput.getMediaType()+")") ;
         
         Sink<Triple> sink = RiotLoader.graphSink(graph) ;
-        RiotLoader.readTriples(typedInput, lang, uri, sink) ;
+        try {
+            RiotLoader.readTriples(typedInput, lang, uri, sink) ;
+        } finally { sink.close() ; }
     }
 
     
@@ -82,7 +84,9 @@ public class WebReader
             throw new RiotException("Can't determine the syntax of <"+uri+"> (media type="+typedInput.getMediaType()+")") ;
         
         Sink<Quad> sink = RiotLoader.datasetSink(dataset) ;
-        RiotLoader.readQuads(typedInput, lang, uri, sink) ;
+        try {
+            RiotLoader.readQuads(typedInput, lang, uri, sink) ;
+        } finally { sink.close() ; }
     }
     
     private static TypedInputStream open(String uri, Lang lang)

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkQuadsToDataset.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkQuadsToDataset.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkQuadsToDataset.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkQuadsToDataset.java Tue Aug 16 08:26:50 2011
@@ -13,13 +13,12 @@ import com.hp.hpl.jena.sparql.SystemARQ 
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 import com.hp.hpl.jena.sparql.core.Quad ;
 
-/** @see SinkTriplesToGraph */ 
+/** Send quads to a dataset.
+ * This Sink must be clsosed after use.
+ */
 public class SinkQuadsToDataset implements Sink<Quad>
 {
-    /* See also SinkToGraphTriples */ 
     private final DatasetGraph dataset ;
-//    private Node graphNode = null ;
-//    private Graph graph = null ;
 
     public SinkQuadsToDataset(DatasetGraph dataset)
     {

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkTriplesToGraph.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkTriplesToGraph.java?rev=1158150&r1=1158149&r2=1158150&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkTriplesToGraph.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/lang/SinkTriplesToGraph.java Tue Aug 16 08:26:50 2011
@@ -6,22 +6,71 @@
 
 package org.openjena.riot.lang;
 
+import org.openjena.atlas.event.Event ;
+import org.openjena.atlas.event.EventListener ;
+import org.openjena.atlas.event.EventManager ;
+import org.openjena.atlas.event.EventType ;
+import org.openjena.atlas.lib.Sink ;
+
 import com.hp.hpl.jena.graph.Graph ;
+import com.hp.hpl.jena.graph.GraphEvents ;
 import com.hp.hpl.jena.graph.Triple ;
+import com.hp.hpl.jena.sparql.SystemARQ ;
 
-
-public class SinkTriplesToGraph extends SinkToGraph
+/**
+ * Send triples to a graph.
+ * This Sink must be closed after use. 
+ */
+public class SinkTriplesToGraph implements Sink<Triple>
 {
+    static final EventType startRead = new EventType("SinkToGraph.StartRead") ;
+    static final EventType finishRead = new EventType("SinkToGraph.FinishRead") ;
+    
+    protected final Graph graph ;
+    private EventListener el1 ;
+    private EventListener el2 ;
+
     public SinkTriplesToGraph(Graph g)
-    {
-        super(g) ;
+    { 
+        this.graph = g ;
+        // Convert between the new global event system (EventManager)
+        // and old style Jena graph events.
+        el1 = new EventListener(){
+            //@Override
+            public void event(Object dest, Event event)
+            {
+                graph.getEventManager().notifyEvent( graph , GraphEvents.startRead ) ;
+            }
+        } ;
+
+        el2 = new EventListener(){
+            //@Override
+            public void event(Object dest, Event event)
+            {
+                graph.getEventManager().notifyEvent( graph , GraphEvents.finishRead ) ;
+            }
+        } ;
+        EventManager.register(this, startRead, el1) ;
+        EventManager.register(this, finishRead, el2) ;
     }
 
-    //@Override
     public void send(Triple triple)
     {
         graph.add(triple) ;
     }
+
+    //@Override
+    public void flush() { SystemARQ.sync(graph) ; }
+    
+    //@Override
+    public void close()
+    {
+        EventManager.unregister(this, finishRead, el2) ;
+        EventManager.unregister(this, startRead, el1) ;
+    }
+
+
+
 }
 
 /*