Author: mikedd
Date: Tue Jun 15 22:26:47 2010
New Revision: 955073

URL: http://svn.apache.org/viewvc?rev=955073&view=rev
Log:
OPENJPA-1678: add printParameters property to prevent SQL parameter values from 
being logged in exceptions or trace

Added:
    
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestParameterLogging.java
   (with props)
Modified:
    
openjpa/branches/2.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java
    
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java

Modified: 
openjpa/branches/2.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java?rev=955073&r1=955072&r2=955073&view=diff
==============================================================================
--- 
openjpa/branches/2.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java
 (original)
+++ 
openjpa/branches/2.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java
 Tue Jun 15 22:26:47 2010
@@ -125,6 +125,7 @@ public class LoggingConnectionDecorator 
     private int _warningAction = WARN_IGNORE;
     private SQLWarningHandler _warningHandler;
     private boolean _trackParameters = true;
+    private boolean _printParameters = false;
 
     /**
      * If set to <code>true</code>, pretty-print SQL by running it
@@ -183,6 +184,21 @@ public class LoggingConnectionDecorator 
     }
 
     /**
+     * <p>
+     * Whether parameter values will be printed in exception messages or in 
trace. This is different from
+     * trackParameters which controls whether OpenJPA will track parameters 
internally (visible while debugging and used
+     * in batching).
+     * </p>
+     */
+    public boolean getPrintParameters() {
+        return _printParameters;
+    }
+
+    public void setPrintParameters(boolean printParameters) {
+        _printParameters = printParameters;
+    }
+
+    /**
      * What to do with SQL warnings.
      */
     public void setWarningAction(String warningAction) {
@@ -1392,7 +1408,12 @@ public class LoggingConnectionDecorator 
                     paramBuf = new StringBuilder();
                     for (Iterator<String> itr = _params.iterator(); itr
                         .hasNext();) {
-                        paramBuf.append(itr.next());
+                        if(_printParameters) { 
+                            paramBuf.append(itr.next());
+                        } else { 
+                            paramBuf.append("?");
+                            itr.next();
+                        }
                         if (itr.hasNext())
                             paramBuf.append(", ");
                     }

Modified: 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java?rev=955073&r1=955072&r2=955073&view=diff
==============================================================================
--- 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java
 (original)
+++ 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java
 Tue Jun 15 22:26:47 2010
@@ -51,6 +51,7 @@ public class TestBatchLimitException ext
                 "openjpa.jdbc.SynchronizeMappings", 
                 "buildSchema(ForeignKeys=true)",
                 "openjpa.jdbc.DBDictionary", batchLimit, 
+                "openjpa.ConnectionFactoryProperties", "PrintParameters=true",
                 CLEAR_TABLES);
 
         assertNotNull("Unable to create EntityManagerFactory", emf);

Added: 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestParameterLogging.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestParameterLogging.java?rev=955073&view=auto
==============================================================================
--- 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestParameterLogging.java
 (added)
+++ 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestParameterLogging.java
 Tue Jun 15 22:26:47 2010
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.exception;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.regex.Pattern;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.RollbackException;
+
+import org.apache.openjpa.persistence.test.PersistenceTestCase;
+
+public class TestParameterLogging extends PersistenceTestCase {
+
+    String _regex = ".*params=.*1,.*]";
+
+    /*
+     * Persist the same row twice in the same transaction - will throw an 
exception with the failing SQL statement
+     */
+    private RollbackException getRollbackException(Object... props) {
+        EntityManagerFactory emf = createEMF(props);
+        EntityManager em = emf.createEntityManager();
+        EntityTransaction tran = em.getTransaction();
+
+        PObject p1, p2;
+        p1 = new PObject();
+        p2 = new PObject();
+
+        p1.setId(1);
+        p2.setId(1);
+
+        try {
+            tran.begin();
+            em.persist(p1);
+            em.persist(p2);
+            tran.commit();
+            em.close();
+            fail("Expected a RollbackException");
+            return null;
+        } catch (RollbackException re) {
+            return re;
+        } finally {
+            if (tran.isActive()) {
+                tran.rollback();
+            }
+            if (em.isOpen()) {
+                em.close();
+            }
+            if (emf.isOpen()) {
+                emf.close();
+            }
+        }
+    }
+
+    /*
+     * Ensure that parameter values are not included in exception text by 
default.
+     */
+    public void testNoParamsByDefault() {
+        RollbackException e = getRollbackException(PObject.class, 
CLEAR_TABLES);
+
+        assertFalse(Pattern.matches(_regex, e.toString()));
+        Throwable nested = e.getCause();
+        while (nested != null) {
+            if (Pattern.matches(".*INSERT.*", nested.toString())) {
+                // only check if the message contains the insert statement.
+                assertFalse(Pattern.matches(_regex, nested.toString()));
+            }
+            nested = nested.getCause();
+        }
+    }
+
+    /*
+     * If the EMF is created with PrintParameters=true the parameter values 
will be logged in exception text.
+     */
+    public void testParamsEnabledByConfig() {
+        RollbackException e =
+            getRollbackException(PObject.class, CLEAR_TABLES, 
"openjpa.ConnectionFactoryProperties",
+                "PrintParameters=true");
+        assertFalse(Pattern.matches(_regex, e.toString()));
+        Throwable nested = e.getCause();
+        assertNotNull(nested); // expecting at least one nested exception.
+        while (nested != null) {
+            if (Pattern.matches(".*INSERT.*", nested.toString())) {
+                // only check if the message contains the insert statement.
+                assertTrue(Pattern.matches(_regex, nested.toString()));
+            }
+            nested = nested.getCause();
+        }
+    }
+}
+

Propchange: 
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestParameterLogging.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to