[Mulgara-svn] r2054 - in trunk/src/jar: content-rdfxml/java/org/mulgara/content/rdfxml/writer krule/java/org/mulgara/krule query/java/org/jrdf/graph/mem query/java/org/mulgara/query resolver/java/org/mulgara/resolver server-rmi/java/org/mulgara/server/rmi store-nodepool-xa/java/org/mulgara/store/nodepool/xa util/java/org/mulgara/util util-xa/java/org/mulgara/store/xa

alexhall at mulgara.org alexhall at mulgara.org
Wed Sep 28 16:13:13 UTC 2011


Author: alexhall
Date: 2011-09-28 16:13:13 +0000 (Wed, 28 Sep 2011)
New Revision: 2054

Modified:
   trunk/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/NamespaceMap.java
   trunk/src/jar/krule/java/org/mulgara/krule/ConsistencyCheck.java
   trunk/src/jar/krule/java/org/mulgara/krule/QueryStruct.java
   trunk/src/jar/krule/java/org/mulgara/krule/Rule.java
   trunk/src/jar/krule/java/org/mulgara/krule/RuleStructure.java
   trunk/src/jar/query/java/org/jrdf/graph/mem/GraphImpl.java
   trunk/src/jar/query/java/org/mulgara/query/AnswerOperations.java
   trunk/src/jar/query/java/org/mulgara/query/GraphAnswer.java
   trunk/src/jar/query/java/org/mulgara/query/RdfXmlEmitter.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/BackupOperation.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/CreateDefaultGraphOperation.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/CreateGraphOperation.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/ExhaustiveTransitiveFunction.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/ExportOperation.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/ModifyGraphOperation.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/RestoreOperation.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/TransitiveFunction.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunction.java
   trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunctionUnitTest.java
   trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJRDFSessionImpl.java
   trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJenaSessionImpl.java
   trunk/src/jar/store-nodepool-xa/java/org/mulgara/store/nodepool/xa/XANodePoolImpl.java
   trunk/src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java
   trunk/src/jar/util-xa/java/org/mulgara/store/xa/ManagedBlockFile.java
   trunk/src/jar/util/java/org/mulgara/util/IntFile.java
Log:
More updates for Fortify compliance - rewriting flow control around try/finally to throw the first exception encountered by an operation, not the last.

Modified: trunk/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/NamespaceMap.java
===================================================================
--- trunk/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/NamespaceMap.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/content-rdfxml/java/org/mulgara/content/rdfxml/writer/NamespaceMap.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -195,6 +195,7 @@
 
     Statements clonedStatements = (Statements)statements.clone();
 
+    boolean success = false;
     try {
 
       //last nodes to be evaluated
@@ -228,9 +229,14 @@
           evaluateAndPut(object, session);
         }
       }
+      success = true;
     } finally {
-
-      clonedStatements.close();
+      try {
+        clonedStatements.close();
+      } catch (TuplesException e) {
+        if (success) throw e; // This is a new exception, need to re-throw it.
+        else logger.info("Suppressing exception cleaning up from failed read", e); // Log suppressed exception.
+      }
     }
   }
 

Modified: trunk/src/jar/krule/java/org/mulgara/krule/ConsistencyCheck.java
===================================================================
--- trunk/src/jar/krule/java/org/mulgara/krule/ConsistencyCheck.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/krule/java/org/mulgara/krule/ConsistencyCheck.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -39,7 +39,7 @@
   private static final long serialVersionUID = 5514372363770138432L;
 
   /** Logger.  */
-  private static Logger logger = Logger.getLogger(ConsistencyCheck.class.getName());
+  private static final Logger logger = Logger.getLogger(ConsistencyCheck.class.getName());
 
 
   /**

Modified: trunk/src/jar/krule/java/org/mulgara/krule/QueryStruct.java
===================================================================
--- trunk/src/jar/krule/java/org/mulgara/krule/QueryStruct.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/krule/java/org/mulgara/krule/QueryStruct.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -60,7 +60,7 @@
   static final long serialVersionUID = -6472138136362435835L;
   
   /** Logger.  */
-  private static Logger logger = Logger.getLogger(QueryStruct.class.getName());
+  private static final Logger logger = Logger.getLogger(QueryStruct.class.getName());
 
   /** List of elements which are variables, or ConstantValues. */
   private List<SelectElement> variables = null;

Modified: trunk/src/jar/krule/java/org/mulgara/krule/Rule.java
===================================================================
--- trunk/src/jar/krule/java/org/mulgara/krule/Rule.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/krule/java/org/mulgara/krule/Rule.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -59,7 +59,7 @@
   private static final long serialVersionUID = 3080424724378196982L;
 
   /** Logger.  */
-  private static Logger logger = Logger.getLogger(Rule.class.getName());
+  private static final Logger logger = Logger.getLogger(Rule.class.getName());
 
   /** The name of this rule. */
   protected String name;

Modified: trunk/src/jar/krule/java/org/mulgara/krule/RuleStructure.java
===================================================================
--- trunk/src/jar/krule/java/org/mulgara/krule/RuleStructure.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/krule/java/org/mulgara/krule/RuleStructure.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -62,7 +62,7 @@
   static final long UNINITIALIZED = -1;
 
   /** Logger.  */
-  private static Logger logger = Logger.getLogger(RuleStructure.class.getName());
+  private static final Logger logger = Logger.getLogger(RuleStructure.class.getName());
 
   /** The rules in the framework. */
   private Set<Rule> rules;

Modified: trunk/src/jar/query/java/org/jrdf/graph/mem/GraphImpl.java
===================================================================
--- trunk/src/jar/query/java/org/jrdf/graph/mem/GraphImpl.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/query/java/org/jrdf/graph/mem/GraphImpl.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -421,10 +421,16 @@
 
     removeFrom012(values[0], values[1], values[2]);
     // if the first one succeeded then try and attempt removal on both of the others
+    boolean success = false;
     try {
       removeFrom120(values[1], values[2], values[0]);
+      success = true;
     } finally {
-      removeFrom201(values[2], values[0], values[1]);
+      try {
+        removeFrom201(values[2], values[0], values[1]);
+      } catch (GraphException e) {
+        if (success) throw e; // Only re-throw if no other exception happened first. No logger, so ignore otherwise.
+      }
     }
   }
 

Modified: trunk/src/jar/query/java/org/mulgara/query/AnswerOperations.java
===================================================================
--- trunk/src/jar/query/java/org/mulgara/query/AnswerOperations.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/query/java/org/mulgara/query/AnswerOperations.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -102,8 +102,8 @@
 
     // Clone the arguments to avoid interfering with their cursors
     lhs = (Answer) lhs.clone();
-    rhs = (Answer) rhs.clone();
     try {
+      rhs = (Answer) rhs.clone();
       // Check that all row values match
       lhs.beforeFirst();
       rhs.beforeFirst();
@@ -144,8 +144,11 @@
     }
     finally {
       // Close our clones
-      lhs.close();
-      rhs.close();
+      try {
+        lhs.close();
+      } finally {
+        if (rhs != null) rhs.close();
+      }
     }
   }
 }

Modified: trunk/src/jar/query/java/org/mulgara/query/GraphAnswer.java
===================================================================
--- trunk/src/jar/query/java/org/mulgara/query/GraphAnswer.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/query/java/org/mulgara/query/GraphAnswer.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -189,7 +189,11 @@
       // Return the raw cardinality
       return rawCardinality;
     } finally {
-      answerCopy.close();
+      try {
+        answerCopy.close();
+      } catch (TuplesException e) {
+        logger.warn("Exception closing cloned answer", e);
+      }
     }
   }
 
@@ -213,7 +217,11 @@
       while (answerCopy.next()) result++;
       return result * rowsPerSoln;
     } finally {
-      answerCopy.close();
+      try {
+        answerCopy.close();
+      } catch (TuplesException e) {
+        logger.warn("Exception closing cloned answer", e);
+      }
     }
   }
 

Modified: trunk/src/jar/query/java/org/mulgara/query/RdfXmlEmitter.java
===================================================================
--- trunk/src/jar/query/java/org/mulgara/query/RdfXmlEmitter.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/query/java/org/mulgara/query/RdfXmlEmitter.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.log4j.Logger;
 import org.jrdf.graph.BlankNode;
 import org.jrdf.graph.Literal;
 import org.jrdf.graph.Node;
@@ -57,6 +58,8 @@
  */
 public class RdfXmlEmitter {
   
+  private static final Logger logger = Logger.getLogger(RdfXmlEmitter.class);
+  
   /** Comparator for sorting statements in the graph. */
   private static final TripleComparator TRIPLE_COMPARATOR = new TripleComparator();
   
@@ -247,7 +250,7 @@
       try {
         if (closeAns) answer.close();
       } catch (TuplesException te) {
-        throw new QueryException("Error closing GraphAnswer", te);
+        logger.warn("Error closing GraphAnswer", te);
       }
     }
     

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/BackupOperation.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/BackupOperation.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/BackupOperation.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -29,6 +29,7 @@
 
 // Java 2 standard packages
 import java.io.BufferedWriter;
+import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
@@ -36,8 +37,10 @@
 import java.util.Date;
 import java.util.zip.GZIPOutputStream;
 
+import org.apache.log4j.Logger;
 import org.mulgara.query.ConstraintImpl;
 import org.mulgara.query.QueryException;
+import org.mulgara.query.TuplesException;
 import org.mulgara.resolver.spi.DatabaseMetadata;
 import org.mulgara.resolver.spi.SecurityAdapter;
 import org.mulgara.resolver.spi.SystemResolver;
@@ -60,6 +63,8 @@
  */
 class BackupOperation extends OutputOperation implements BackupConstants, Operation {
 
+  private static final Logger logger = Logger.getLogger(BackupOperation.class);
+  
   //
   // Constructor
   //
@@ -95,8 +100,9 @@
       }
     }
     
-    OutputStream os = getOutputStream();;
+    OutputStream os = getOutputStream();
     Writer writer = null;
+    boolean success = false;
     try {
       // The existence of a fragment indicates that a model is to be backed
       // up otherwise the entire database is to be backed up.
@@ -105,15 +111,21 @@
       ));
       
       backupDatabase(systemResolver, metadata, writer);
+      success = true;
     } finally {
       // Clean up.
-      if (writer != null) {
-        // Close the writer if it exists.  This will also close the wrapped
-        // OutputStream.
-        writer.close();
-      } else if (os != null) {
-        // Close the os if it exists.
-        os.close();
+      try {
+        if (writer != null) {
+          // Close the writer if it exists.  This will also close the wrapped
+          // OutputStream.
+          writer.close();
+        } else if (os != null) {
+          // Close the os if it exists.
+          os.close();
+        }
+      } catch (IOException e) {
+        if (success) throw e; // The backup worked but we couldn't close, so re-throw.
+        else logger.info("Suppressing I/O exception closing failed backup writer", e); // Log and ignore.
       }
     }
   }
@@ -151,7 +163,11 @@
         writer.write('\n');
       }
     } finally {
-      t.close();
+      try {
+        t.close();
+      } catch (TuplesException e) {
+        logger.warn("Error closing tuples during backup", e);
+      }
     }
 
     // Dump the triples.
@@ -181,7 +197,11 @@
         }
       }
     } finally {
-      tuples.close();
+      try {
+        tuples.close();
+      } catch (TuplesException e) {
+        logger.warn("Error closing tuples during backup", e);
+      }
     }
 
     writer.write("END\n");

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/CreateDefaultGraphOperation.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/CreateDefaultGraphOperation.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/CreateDefaultGraphOperation.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -36,7 +36,6 @@
  */
 class CreateDefaultGraphOperation implements Operation {
   /** Logger. This is named after the class. */
-  @SuppressWarnings("unused")
   private static final Logger logger = Logger.getLogger(CreateDefaultGraphOperation.class.getName());
 
   /** The URI of the model to be created. */
@@ -82,6 +81,7 @@
         new Variable("x"),
         new LocalNode(metadata.getSystemModelNode())));
 
+    boolean success = false;
     try {
       resolution.beforeFirst();
       if (resolution.next()) {
@@ -98,8 +98,14 @@
           throw new QueryException("Invalid model type entry in system model: " + graphURI + " <rdf:type> " + eNode);
         }
       }
+      success = true;
     } finally {
-      resolution.close();
+      try {
+        resolution.close();
+      } catch (TuplesException e) {
+        if (success) throw e; // This is a new exception, need to re-throw it.
+        else logger.info("Suppressing exception cleaning up from failed read", e); // Log suppressed exception.
+      }
     }
 
     // Find the local node identifying the system graph and rdf:type

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/CreateGraphOperation.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/CreateGraphOperation.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/CreateGraphOperation.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -55,7 +55,6 @@
  */
 class CreateGraphOperation implements Operation {
   /** Logger. This is named after the class. */
-  @SuppressWarnings("unused")
   private static final Logger logger = Logger.getLogger(CreateGraphOperation.class.getName());
 
   /** The parameter used for describing subgraphs within a URI. */
@@ -124,6 +123,7 @@
         new Variable("x"),
         new LocalNode(metadata.getSystemModelNode())));
 
+    boolean success = false;
     try {
       resolution.beforeFirst();
       if (resolution.next()) {
@@ -138,8 +138,14 @@
           throw new QueryException("Invalid model type entry in system model: " + graphURI + " <rdf:type> " + eNode);
         }
       }
+      success = true;
     } finally {
-      resolution.close();
+      try {
+        resolution.close();
+      } catch (TuplesException e) {
+        if (success) throw e; // This is a new exception, need to re-throw it.
+        else logger.info("Suppressing exception cleaning up from failed read", e); // Log suppressed exception.
+      }
     }
 
 

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/ExhaustiveTransitiveFunction.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/ExhaustiveTransitiveFunction.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/ExhaustiveTransitiveFunction.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -81,7 +81,7 @@
   /**
    * Logger.
    */
-  private static Logger logger = Logger.getLogger(
+  private static final Logger logger = Logger.getLogger(
       ExhaustiveTransitiveFunction.class.getName());
 
   /**
@@ -124,6 +124,7 @@
     Tuples initialTuples = null;
     Tuples workingTuples = null;
 
+    boolean success = false;
     try {
 
       // Get the wrapped constraint
@@ -184,7 +185,7 @@
         }
 
         // remember that the subject has been visited
-        Set visited = new HashSet();
+        Set<Long> visited = new HashSet<Long>();
         visited.add(subjectL);
 
         // add the object to the "given" tuples
@@ -221,14 +222,19 @@
         logger.debug("Finished all inferencing");
       }
 
+      success = true;
       return inferredResult;
     } finally {
-      if (initialTuples != null) {
-        initialTuples.close();
+      try {
+        try {
+          if (initialTuples != null) initialTuples.close();
+        } finally {
+          if (workingTuples != null) workingTuples.close();
+        }
+      } catch (TuplesException e) {
+        if (success) throw e; // Everything worked up to this point, re-throw this one.
+        else logger.info("Suppressing exception closing failed tuples", e); // Log and ignore redundant exception.
       }
-      if (workingTuples != null) {
-        workingTuples.close();
-      }
     }
   }
 
@@ -293,6 +299,7 @@
     Tuples initialTuples = null;
     Tuples workingTuples = null;
 
+    boolean success = false;
     try {
       // Get the wrapped constraint
       Constraint anchoredConstraint = constraint.getAnchoredConstraint();
@@ -359,7 +366,7 @@
         }
 
         // remember that the subject has been visited
-        Set visited = new HashSet();
+        Set<Long> visited = new HashSet<Long>();
         visited.add(subjectL);
 
         // add the object to the "given" tuples
@@ -396,14 +403,19 @@
         logger.debug("Finished all inferencing");
       }
 
+      success = true;
       return inferredResult;
     } finally {
-      if (initialTuples != null) {
-        initialTuples.close();
+      try {
+        try {
+          if (initialTuples != null) initialTuples.close();
+        } finally {
+          if (workingTuples != null) workingTuples.close();
+        }
+      } catch (TuplesException e) {
+        if (success) throw e; // Everything worked up to this point, re-throw this one.
+        else logger.info("Suppressing exception closing failed tuples", e); // Log and ignore redundant exception.
       }
-      if (workingTuples != null) {
-        workingTuples.close();
-      }
     }
   }
 }

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/ExportOperation.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/ExportOperation.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/ExportOperation.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -15,12 +15,14 @@
  */
 package org.mulgara.resolver;
 
+import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URI;
 import java.util.Map;
 
 import javax.activation.MimeType;
 
+import org.apache.log4j.Logger;
 import org.mulgara.content.Content;
 import org.mulgara.content.ContentHandler;
 import org.mulgara.content.ContentHandlerManager;
@@ -49,6 +51,8 @@
  */
 class ExportOperation extends OutputOperation {
 
+  private static final Logger logger = Logger.getLogger(ExportOperation.class);
+  
   private final URI graphURI;
   private final Map<String,URI> prefixes;
   private final MimeType contentType;
@@ -99,6 +103,7 @@
       OutputStream os = getOutputStream();
       assert os != null;
 
+      boolean success = false;
       try {
         Content content = new StreamContent(os, destinationURI, contentType);
         ContentHandler handler = contentManager.getContentHandler(content);
@@ -123,11 +128,17 @@
           // This will close the wrapped resolution as well.
           graphStatements.close();
         }
+        success = true;
       } finally {
         // Clean up.
         if (os != null) {
           // Close the os if it exists.
-          os.close();
+          try {
+            os.close();
+          } catch (IOException e) {
+            if (success) throw e; // The export worked but we couldn't close the stream, so re-throw.
+            else logger.info("Suppressing I/O exception closing failed export output", e); // Log and ignore.
+          }
         }
       }
     } else {

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/ModifyGraphOperation.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/ModifyGraphOperation.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/ModifyGraphOperation.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -166,7 +166,7 @@
                       SystemResolver         systemResolver,
                       DatabaseMetadata       metadata) throws Exception
   {
-    Statements statements;
+    Statements statements = null;
     if (tripleSet != null) {
       assert query == null;
 
@@ -183,16 +183,29 @@
         statements = new TuplesWrapperStatements(
             new LocalizedTuples(systemResolver, answer, insert),
             vars[0], vars[1], vars[2]);
-      } finally {
         answer.close();
+      } catch (TuplesException e) {
+        try {
+          if (statements == null) answer.close();
+        } catch (TuplesException e2) {
+          logger.warn("Suppressing exception closing failed answer.", e2);
+        }
+        throw e;
       }
     }
     assert statements != null;
 
+    boolean success = false;
     try {
       doModify(operationContext, systemResolver, modelURI, statements, insert);
+      success = true;
     } finally {
-      statements.close();
+      try {
+        statements.close();
+      } catch (TuplesException e) {
+        if (success) throw e;
+        else logger.warn("Suppressing exception closing statements on failed modify", e);
+      }
     }
   }
 

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/RestoreOperation.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/RestoreOperation.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/RestoreOperation.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -49,6 +49,7 @@
 import org.apache.log4j.Logger;
 import org.mulgara.query.ConstraintImpl;
 import org.mulgara.query.QueryException;
+import org.mulgara.query.TuplesException;
 import org.mulgara.resolver.spi.BackupRestoreSession;
 import org.mulgara.resolver.spi.DatabaseMetadata;
 import org.mulgara.resolver.spi.Resolver;
@@ -140,13 +141,17 @@
 
       restoreDatabase(systemResolver, systemResolver, metadata, br);
     } finally {
-      if (br != null) {
-        // Close the BufferedReader if it exists.  This will also close the
-        // wrapped InputStream.
-        br.close();
-      } else if (is != null) {
-        // Close the InputStream if it exists.
-        is.close();
+      try {
+        if (br != null) {
+          // Close the BufferedReader if it exists.  This will also close the
+          // wrapped InputStream.
+          br.close();
+        } else if (is != null) {
+          // Close the InputStream if it exists.
+          is.close();
+        }
+      } catch (IOException e) {
+        logger.warn("I/O exception closing input to system restore", e);
       }
     }
   }
@@ -222,6 +227,7 @@
                                      StatementStore.VARIABLES[3]));
     int[] colMap = mapColumnsToStd(tuples.getVariables());
 
+    boolean success = false;
     try {
       tuples.beforeFirst();
 
@@ -238,8 +244,14 @@
           );
         }
       }
+      success = true;
     } finally {
-      tuples.close();
+      try {
+        tuples.close();
+      } catch (TuplesException e) {
+        if (success) throw e; // New exception, need to re-throw it.
+        else logger.info("Suppressing exception closing failed tuples", e); // Already failed, log this exception.
+      }
     }
 
     // n2nMap maps from node IDs in the backup file to node IDs in the
@@ -540,6 +552,7 @@
                                      StatementStore.VARIABLES[3]));
     int[] colMap = mapColumnsToStd(tuples.getVariables());
 
+    boolean success = false;
     try {
       tuples.beforeFirst();
 
@@ -556,8 +569,14 @@
           );
         }
       }
+      success = true;
     } finally {
-      tuples.close();
+      try {
+        tuples.close();
+      } catch (TuplesException e) {
+        if (success) throw e; // New exception, need to re-throw it.
+        else logger.info("Suppressing exception closing failed tuples", e); // Already failed, log this exception.
+      }
     }
 
     // n2nMap maps from node IDs in the backup file to node IDs in the store.
@@ -637,7 +656,7 @@
     } finally {
       try {
         if (n2nMap != null) n2nMap.delete();
-      } catch (IOException e) {
+      } catch (Exception e) {
         logger.warn("I/O error on close", e);
       }
     }

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/TransitiveFunction.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/TransitiveFunction.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/TransitiveFunction.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -28,9 +28,7 @@
 package org.mulgara.resolver;
 
 // Java 2 standard packages;
-import java.net.*;
 import java.util.*;
-import java.io.*;
 
 // Third party packages
 import org.apache.log4j.Logger;
@@ -66,8 +64,7 @@
   /**
    * Logger.
    */
-  private static Logger logger = Logger.getLogger(
-      TransitiveFunction.class.getName());
+  private static final Logger logger = Logger.getLogger(TransitiveFunction.class.getName());
 
   /**
    * This method finds all statements that match a <code>given</code> tuples,
@@ -91,7 +88,7 @@
    */
   protected static void inferTransitiveStatements(
       Long baseSubject, long subject, Tuples initialTuples,
-      Tuples given, Set visited, LiteralTuples inferredResult)
+      Tuples given, Set<Long> visited, LiteralTuples inferredResult)
       throws TuplesException {
     assert initialTuples.getNumberOfVariables() == 2;
     assert given.getNumberOfVariables() == 1;
@@ -131,6 +128,7 @@
         logger.debug("Joined with a given of: " + gs);
       }
 
+      TuplesException te = null;
       try {
         // check if there is any data from the join
         joinResult.beforeFirst();
@@ -185,10 +183,24 @@
           // tell the visited set that we have been here
           visited.add(objectL);
         } while (joinResult.next());
+      } catch (TuplesException e) {
+        te = e;
       } finally {
         // clean up the tuples objects, either by falling through, or from the break above
-        joinResult.close();
-        given.close();
+        try {
+          if (joinResult != null) joinResult.close();
+        } catch (TuplesException e) {
+          if (te == null) te = e;
+          else logger.info("Suppressing exception closing tuples on failed transitive function", e);
+        } finally {
+          try {
+            if (given != null) given.close();
+          } catch (TuplesException e) {
+            if (te == null) te = e;
+            else logger.info("Suppressing exception closing tuples on failed transitive function", e);
+          }
+        }
+        if (te != null) throw te;
       }
 
       // use this new given, and iterate

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunction.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunction.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunction.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -83,8 +83,7 @@
   /**
    * Logger.
    */
-  private static Logger logger = Logger.getLogger(
-      WalkFunction.class.getName());
+  private static final Logger logger = Logger.getLogger(WalkFunction.class.getName());
 
   /**
    * Resolves a walk constraint.  This means finding all statements matching
@@ -146,6 +145,7 @@
     Tuples initialTuples = null;
     Tuples predTuples = null;
 
+    boolean success = false;
     try {
 
       // ask for all statements for this predicate
@@ -235,7 +235,7 @@
       predTuples = query.resolve(graphExpression, openConstraint);
 
       // remember that the current value has been visited
-      Set visited = new HashSet();
+      Set<Long> visited = new HashSet<Long>();
       visited.add(value);
 
       // Get object/subject node value
@@ -253,17 +253,20 @@
         logger.debug("Finished all inferencing");
       }
 
+      success = true;
       return inferredResult;
-    }
-    finally {
-
+    } finally {
       // clean up tuples
-      if (initialTuples != null) {
-        initialTuples.close();
+      try {
+        try {
+          if (initialTuples != null) initialTuples.close();
+        } finally {
+          if (predTuples != null) predTuples.close();
+        }
+      } catch (TuplesException e) {
+        if (success) throw e; // Everything worked up to this point, re-throw this one.
+        else logger.info("Suppressing exception closing failed tuples", e); // Log and ignore redundant exception.
       }
-      if (predTuples != null) {
-        predTuples.close();
-      }
     }
   }
 
@@ -288,7 +291,7 @@
    *   around in results of the query resolutions.
    */
   public static void walkStatements(Tuples initialTuples,
-      Tuples given, Set visited, LiteralTuples inferredResult)
+      Tuples given, Set<Long> visited, LiteralTuples inferredResult)
       throws TuplesException, QueryException {
 
     assert initialTuples.getNumberOfVariables() == 2;
@@ -335,6 +338,7 @@
         logger.debug("Joined with a given of: " + gs);
       }
 
+      boolean success = false;
       try {
 
         // check if there is any data from the join
@@ -384,12 +388,20 @@
           visited.add(objectL);
         }
         while (joinResult.next());
+        success = true;
       }
       finally {
-
         // clean up the tuples objects, either by falling through, or from the break above
-        joinResult.close();
-        given.close();
+        try {
+          try {
+            if (joinResult != null) joinResult.close();
+          } finally {
+            if (given != null) given.close();
+          }
+        } catch (TuplesException e) {
+          if (success) throw e; // Everything worked up to this point, re-throw this one.
+          else logger.info("Suppressing exception closing failed tuples", e); // Log and ignore redundant exception.
+        }
       }
 
       // use this new given, and iterate

Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunctionUnitTest.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunctionUnitTest.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/WalkFunctionUnitTest.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -63,8 +63,8 @@
   /**
    * Logger.
    */
-  private Logger logger =
-      Logger.getLogger(WalkFunctionUnitTest.class.getName());
+  @SuppressWarnings("unused")
+  private Logger logger = Logger.getLogger(WalkFunctionUnitTest.class.getName());
 
   /**
    * Tuples for testing with.
@@ -305,7 +305,7 @@
     given.appendTuple(new long[] { subject });
 
     // Visited.
-    Set visited = new HashSet();
+    Set<Long> visited = new HashSet<Long>();
     visited.add(new Long(subject));
 
     // Results are the subject and object.

Modified: trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJRDFSessionImpl.java
===================================================================
--- trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJRDFSessionImpl.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJRDFSessionImpl.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -63,7 +63,6 @@
 class RemoteJRDFSessionImpl extends JRDFSessionWrapperRemoteJRDFSession implements RemoteJRDFSession {
 
   /** Logger. */
-  @SuppressWarnings("unused")
   private final static Logger logger = Logger.getLogger(RemoteJRDFSessionImpl.class.getName());
 
   /**
@@ -90,12 +89,18 @@
    * @throws RemoteException EXCEPTION TO DO
    */
   public void close() throws QueryException, RemoteException {
+    boolean success = false;
     try {
       super.close();
+      success = true;
+    } finally {
+      try {
+        // remove the instance from the factory
+        remoteSessionFactory.removeSession(this);
+      } catch (RemoteException e) {
+        if (success) throw e; // This is a new exception, need to re-throw it.
+        else logger.info("Suppressing remote exception cleaning up from failed close", e); // Log suppressed exception.
+      }
     }
-    finally {
-      // remove the instance from the factory
-      remoteSessionFactory.removeSession(this);
-    }
   }
 }

Modified: trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJenaSessionImpl.java
===================================================================
--- trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJenaSessionImpl.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteJenaSessionImpl.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -60,7 +60,6 @@
     implements RemoteJenaSession {
 
   /** Logger. */
-  @SuppressWarnings("unused")
   private final static Logger logger = Logger.getLogger(RemoteJenaSessionImpl.class.getName());
 
   /**
@@ -82,11 +81,18 @@
   }
 
   public void close() throws QueryException, RemoteException {
+    boolean success = false;
     try {
       super.close();
+      success = true;
+    } finally {
+      try {
+        // remove the instance from the factory
+        remoteSessionFactory.removeSession(this);
+      } catch (RemoteException e) {
+        if (success) throw e; // This is a new exception, need to re-throw it.
+        else logger.info("Suppressing remote exception cleaning up from failed close", e); // Log suppressed exception.
+      }
     }
-    finally {
-      remoteSessionFactory.removeSession(this);
-    }
   }
 }

Modified: trunk/src/jar/store-nodepool-xa/java/org/mulgara/store/nodepool/xa/XANodePoolImpl.java
===================================================================
--- trunk/src/jar/store-nodepool-xa/java/org/mulgara/store/nodepool/xa/XANodePoolImpl.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/store-nodepool-xa/java/org/mulgara/store/nodepool/xa/XANodePoolImpl.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -709,6 +709,7 @@
    */
   public synchronized void rollback() throws SimpleXAResourceException {
     checkInitialized();
+    boolean success = false;
     try {
       if (prepared) {
         // Restore phaseIndex and phaseNumber to their previous values.
@@ -723,6 +724,7 @@
         block.write();
         metarootFile.force();
       }
+      success = true;
     } catch (IOException ex) {
       throw new SimpleXAResourceException(
           "I/O error while performing rollback (invalidating metaroot)", ex
@@ -731,9 +733,9 @@
       try {
         currentPhase = freeList.new Phase(committedPhaseToken.getPhase());
       } catch (IOException ex) {
-        throw new SimpleXAResourceException(
-            "I/O error while performing rollback (new committed phase)", ex
-        );
+        String msg = "I/O error while performing rollback (new committed phase)";
+        if (success) throw new SimpleXAResourceException(msg, ex); // new exception, need to re-throw.
+        else logger.info(msg, ex); // already had a different exception, suppress this one and log it. 
       }
     }
   }

Modified: trunk/src/jar/util/java/org/mulgara/util/IntFile.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/IntFile.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/util/java/org/mulgara/util/IntFile.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -389,6 +389,7 @@
    */
   private void close(boolean truncateFile) throws IOException {
     // Truncate the file to the correct size.
+    boolean success = false;
     try {
       unmap();
 
@@ -401,11 +402,18 @@
           fc.close();
         }
       }
+      success = true;
     } finally {
       fc = null;
       if (raf != null) {
-        raf.close();
-        raf = null;
+        try {
+          raf.close();
+        } catch (IOException e) {
+          if (success) throw e; // Everything else worked, rethrow this.
+          else logger.info("Suppressing I/O exception closing failed IntFile", e); // Log and ignore, already got another exception.
+        } finally {
+          raf = null;
+        }
       }
     }
   }

Modified: trunk/src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java
===================================================================
--- trunk/src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/util-xa/java/org/mulgara/store/xa/FreeList.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -342,12 +342,21 @@
     try {
       unmap();
     } finally {
+      IOException ex = null;
       try {
         if (itemToPhaseSeqMap != null) itemToPhaseSeqMap.delete();
+      } catch (IOException e) {
+        ex = e;
       } finally {
         itemToPhaseSeqMap = null;
+      }
+      try {
         blockFile.close();
+      } catch (IOException e) {
+        if (ex == null) ex = e;
+        else logger.info("Suppressing exception deleting file for failed FreeList", e);
       }
+      if (ex != null) throw ex;
     }
   }
 
@@ -360,12 +369,21 @@
     try {
       unmap();
     } finally {
+      IOException ex = null;
       try {
         if (itemToPhaseSeqMap != null) itemToPhaseSeqMap.delete();
+      } catch (IOException e) {
+        ex = e;
       } finally {
         itemToPhaseSeqMap = null;
+      }
+      try {
         blockFile.delete();
+      } catch (IOException e) {
+        if (ex == null) ex = e;
+        else logger.info("Suppressing exception deleting file for failed FreeList", e);
       }
+      if (ex != null) throw ex;
     }
   }
 

Modified: trunk/src/jar/util-xa/java/org/mulgara/store/xa/ManagedBlockFile.java
===================================================================
--- trunk/src/jar/util-xa/java/org/mulgara/store/xa/ManagedBlockFile.java	2011-09-28 13:40:13 UTC (rev 2053)
+++ trunk/src/jar/util-xa/java/org/mulgara/store/xa/ManagedBlockFile.java	2011-09-28 16:13:13 UTC (rev 2054)
@@ -181,6 +181,7 @@
    * @throws IOException if an I/O error occurs.
    */
   private void close(boolean deleteFiles) throws IOException {
+    boolean success = false;
     try {
       if (blockFile != null) {
         try {
@@ -206,13 +207,19 @@
           }
         }
       }
+      success = true;
     } finally {
-      if (freeList != null) {
-        if (deleteFiles) {
-          freeList.delete();
-        } else {
-          freeList.close();
+      try {
+        if (freeList != null) {
+          if (deleteFiles) {
+            freeList.delete();
+          } else {
+            freeList.close();
+          }
         }
+      } catch (IOException e) {
+        if (success) throw e; // Worked up to now; re-throw this exception.
+        else logger.info("Suppressing I/O exception while closing failed resource", e); // Something else already failed.
       }
     }
   }



More information about the Mulgara-svn mailing list