You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/03/28 09:07:09 UTC

svn commit: r1582630 - in /cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto: batch/CryptoBatchTranslatorFactoryDecorator.java cipher/Encryptor.java cipher/EncryptorFactory.java

Author: aadamchik
Date: Fri Mar 28 08:07:09 2014
New Revision: 1582630

URL: http://svn.apache.org/r1582630
Log:
CAY-1916 cayenne-crypto module that enables data encryption for certain model attributes

a concept of Encryptor
precompiling Encryptors for batch query execution

Added:
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java
Modified:
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java?rev=1582630&r1=1582629&r2=1582630&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java Fri Mar 28 08:07:09 2014
@@ -21,8 +21,8 @@ package org.apache.cayenne.crypto.batch;
 import org.apache.cayenne.access.translator.batch.BatchParameterBinding;
 import org.apache.cayenne.access.translator.batch.BatchTranslator;
 import org.apache.cayenne.access.translator.batch.BatchTranslatorFactory;
-import org.apache.cayenne.crypto.cipher.CryptoHandler;
-import org.apache.cayenne.crypto.map.ColumnMapper;
+import org.apache.cayenne.crypto.cipher.Encryptor;
+import org.apache.cayenne.crypto.cipher.EncryptorFactory;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.query.BatchQuery;
@@ -33,15 +33,13 @@ import org.apache.cayenne.query.BatchQue
  */
 public class CryptoBatchTranslatorFactoryDecorator implements BatchTranslatorFactory {
 
-    private CryptoHandler cryptoHandler;
-    private ColumnMapper columnMapper;
+    private EncryptorFactory encryptorFactory;
     private BatchTranslatorFactory delegate;
 
     public CryptoBatchTranslatorFactoryDecorator(@Inject BatchTranslatorFactory delegate,
-            @Inject CryptoHandler cryptoHandler, @Inject ColumnMapper columnMapper) {
+            @Inject EncryptorFactory encryptorFactory) {
 
-        this.columnMapper = columnMapper;
-        this.cryptoHandler = cryptoHandler;
+        this.encryptorFactory = encryptorFactory;
         this.delegate = delegate;
     }
 
@@ -51,26 +49,42 @@ public class CryptoBatchTranslatorFactor
 
         return new BatchTranslator() {
 
+            private int len;
+            private Encryptor[] encryptors;
+
+            private void ensureEncryptorsCompiled() {
+                if (encryptors == null) {
+                    BatchParameterBinding[] bindings = getBindings();
+
+                    this.len = bindings.length;
+                    this.encryptors = new Encryptor[len];
+
+                    for (int i = 0; i < len; i++) {
+                        encryptors[i] = encryptorFactory.getEncryptor(bindings[i].getAttribute());
+                    }
+                }
+            }
+
             @Override
             public String getSql() {
                 return delegateTranslator.getSql();
             }
-            
+
             @Override
             public BatchParameterBinding[] getBindings() {
                 return delegateTranslator.getBindings();
             }
-            
+
             @Override
             public BatchParameterBinding[] updateBindings(BatchQueryRow row) {
-              
+
+                ensureEncryptorsCompiled();
+
                 BatchParameterBinding[] bindings = delegateTranslator.updateBindings(row);
 
-                for (BatchParameterBinding b : bindings) {
-                    if (columnMapper.isEncrypted(b.getAttribute())) {
-                        Object encrypted = cryptoHandler.encrypt(b.getValue(), b.getAttribute().getType());
-                        b.setValue(encrypted);
-                    }
+                for (int i = 0; i < len; i++) {
+                    Object encrypted = encryptors[i].encrypt(bindings[i].getValue());
+                    bindings[i].setValue(encrypted);
                 }
 
                 return bindings;

Added: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java?rev=1582630&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java (added)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java Fri Mar 28 08:07:09 2014
@@ -0,0 +1,29 @@
+/*****************************************************************
+ *   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.cayenne.crypto.cipher;
+
+/**
+ * An encryptor object configured to encrypt a value of a certain type.
+ * 
+ * @since 3.2
+ */
+public interface Encryptor {
+
+    Object encrypt(Object value);
+}

Added: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java?rev=1582630&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java (added)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java Fri Mar 28 08:07:09 2014
@@ -0,0 +1,29 @@
+/*****************************************************************
+ *   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.cayenne.crypto.cipher;
+
+import org.apache.cayenne.map.DbAttribute;
+
+/**
+ * @since 3.2
+ */
+public interface EncryptorFactory {
+
+    Encryptor getEncryptor(DbAttribute column);
+}