Author: aadamchik
Date: Fri Mar 28 08:07:26 2014
New Revision: 1582631

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

encryptor implementation

Added:
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoFactory.java
      - copied, changed from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoHandler.java
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Decryptor.java
      - copied, changed from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactory.java
      - copied, changed from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandler.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactoryTest.java
      - copied, changed from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandlerTest.java
Removed:
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoHandler.java
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandler.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandlerTest.java
Modified:
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
    
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/reader/CryptoRowReaderFactoryDecorator.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Crypto_InRuntime_Test.java

Modified: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java?rev=1582631&r1=1582630&r2=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
 Fri Mar 28 08:07:26 2014
@@ -21,7 +21,7 @@ package org.apache.cayenne.crypto;
 import org.apache.cayenne.access.jdbc.reader.RowReaderFactory;
 import org.apache.cayenne.access.translator.batch.BatchTranslatorFactory;
 import org.apache.cayenne.crypto.batch.CryptoBatchTranslatorFactoryDecorator;
-import org.apache.cayenne.crypto.cipher.CryptoHandler;
+import org.apache.cayenne.crypto.cipher.CryptoFactory;
 import org.apache.cayenne.crypto.map.ColumnMapper;
 import org.apache.cayenne.crypto.reader.CryptoRowReaderFactoryDecorator;
 import org.apache.cayenne.di.Binder;
@@ -37,13 +37,13 @@ import org.apache.cayenne.di.Module;
  */
 public class CryptoModuleBuilder {
 
-    private Class<? extends CryptoHandler> cryptoHandlerType;
+    private Class<? extends CryptoFactory> cryptoFactoryType;
 
     private ColumnMapper columnMapper;
     private Class<? extends ColumnMapper> columnMapperType;
 
-    public CryptoModuleBuilder cryptoHandler(Class<? extends CryptoHandler> 
cryptoHandlerType) {
-        this.cryptoHandlerType = cryptoHandlerType;
+    public CryptoModuleBuilder cryptoFactory(Class<? extends CryptoFactory> 
cryptoFactoryType) {
+        this.cryptoFactoryType = cryptoFactoryType;
         return this;
     }
 
@@ -64,7 +64,7 @@ public class CryptoModuleBuilder {
      */
     public Module build() {
 
-        if (cryptoHandlerType == null) {
+        if (cryptoFactoryType == null) {
             throw new IllegalStateException("'CryptoHandler' is not 
initialized");
         }
 
@@ -76,7 +76,7 @@ public class CryptoModuleBuilder {
 
             @Override
             public void configure(Binder binder) {
-                binder.bind(CryptoHandler.class).to(cryptoHandlerType);
+                binder.bind(CryptoFactory.class).to(cryptoFactoryType);
 
                 if (columnMapperType != null) {
                     binder.bind(ColumnMapper.class).to(columnMapperType);

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=1582631&r1=1582630&r2=1582631&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:26 2014
@@ -18,13 +18,18 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.batch;
 
+import java.util.ArrayList;
+import java.util.List;
+
 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.CryptoFactory;
 import org.apache.cayenne.crypto.cipher.Encryptor;
-import org.apache.cayenne.crypto.cipher.EncryptorFactory;
+import org.apache.cayenne.crypto.map.ColumnMapper;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.BatchQueryRow;
 
@@ -33,13 +38,17 @@ import org.apache.cayenne.query.BatchQue
  */
 public class CryptoBatchTranslatorFactoryDecorator implements 
BatchTranslatorFactory {
 
-    private EncryptorFactory encryptorFactory;
+    private static final PositionalEncryptor[] EMPTY_ENCRYPTORS = new 
PositionalEncryptor[0];
+
+    private ColumnMapper columnMapper;
+    private CryptoFactory cryptoFactory;
     private BatchTranslatorFactory delegate;
 
     public CryptoBatchTranslatorFactoryDecorator(@Inject 
BatchTranslatorFactory delegate,
-            @Inject EncryptorFactory encryptorFactory) {
+            @Inject CryptoFactory cryptoFactory, @Inject ColumnMapper 
columnMapper) {
 
-        this.encryptorFactory = encryptorFactory;
+        this.cryptoFactory = cryptoFactory;
+        this.columnMapper = columnMapper;
         this.delegate = delegate;
     }
 
@@ -50,18 +59,32 @@ public class CryptoBatchTranslatorFactor
         return new BatchTranslator() {
 
             private int len;
-            private Encryptor[] encryptors;
+            private PositionalEncryptor[] encryptors;
 
             private void ensureEncryptorsCompiled() {
-                if (encryptors == null) {
+                if (this.encryptors == null) {
                     BatchParameterBinding[] bindings = getBindings();
 
-                    this.len = bindings.length;
-                    this.encryptors = new Encryptor[len];
+                    int len = bindings.length;
+                    List<PositionalEncryptor> encList = null;
 
                     for (int i = 0; i < len; i++) {
-                        encryptors[i] = 
encryptorFactory.getEncryptor(bindings[i].getAttribute());
+
+                        DbAttribute a = bindings[i].getAttribute();
+                        if (columnMapper.isEncrypted(a)) {
+
+                            if (encList == null) {
+                                encList = new 
ArrayList<PositionalEncryptor>(len - i);
+                            }
+
+                            Encryptor e = cryptoFactory.getEncryptor(a);
+                            encList.add(new PositionalEncryptor(i, e));
+                        }
                     }
+
+                    this.encryptors = encList == null ? EMPTY_ENCRYPTORS : 
encList
+                            .toArray(new PositionalEncryptor[encList.size()]);
+                    this.len = encryptors.length;
                 }
             }
 
@@ -83,12 +106,23 @@ public class CryptoBatchTranslatorFactor
                 BatchParameterBinding[] bindings = 
delegateTranslator.updateBindings(row);
 
                 for (int i = 0; i < len; i++) {
-                    Object encrypted = 
encryptors[i].encrypt(bindings[i].getValue());
-                    bindings[i].setValue(encrypted);
+                    BatchParameterBinding b = bindings[encryptors[i].position];
+                    Object encrypted = 
encryptors[i].encryptor.encrypt(b.getValue());
+                    b.setValue(encrypted);
                 }
 
                 return bindings;
             }
         };
     }
+
+    class PositionalEncryptor {
+        final int position;
+        final Encryptor encryptor;
+
+        PositionalEncryptor(int position, Encryptor encryptor) {
+            this.position = position;
+            this.encryptor = encryptor;
+        }
+    }
 }

Copied: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoFactory.java
 (from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoHandler.java)
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoFactory.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoFactory.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoHandler.java&r1=1582630&r2=1582631&rev=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoHandler.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/CryptoFactory.java
 Fri Mar 28 08:07:26 2014
@@ -18,12 +18,17 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.cipher;
 
+import org.apache.cayenne.map.DbAttribute;
+
 /**
+ * A factory that creates encryption/decryption handlers that can be used to
+ * process data.
+ * 
  * @since 3.2
  */
-public interface CryptoHandler {
+public interface CryptoFactory {
 
-    Object encrypt(Object plaintext, int jdbcType);
+    Encryptor getEncryptor(DbAttribute column);
 
-    Object decrypt(Object ciphertext, int jdbcType);
+    Decryptor getDecryptor(DbAttribute column);
 }

Copied: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Decryptor.java
 (from r1582630, 
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/Decryptor.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Decryptor.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java&r1=1582630&r2=1582631&rev=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/EncryptorFactory.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Decryptor.java
 Fri Mar 28 08:07:26 2014
@@ -18,12 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.cipher;
 
-import org.apache.cayenne.map.DbAttribute;
-
 /**
+ * An decryptor object configured to decrypt a value of a certain type.
+ * 
  * @since 3.2
  */
-public interface EncryptorFactory {
+public interface Decryptor {
 
-    Encryptor getEncryptor(DbAttribute column);
+    Object decrypt(Object ciphertext);
 }

Modified: 
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=1582631&r1=1582630&r2=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/Encryptor.java
 Fri Mar 28 08:07:26 2014
@@ -25,5 +25,5 @@ package org.apache.cayenne.crypto.cipher
  */
 public interface Encryptor {
 
-    Object encrypt(Object value);
+    Object encrypt(Object plaintext);
 }

Modified: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java?rev=1582631&r1=1582630&r2=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/reader/CryptoRowReaderFactoryDecorator.java
 Fri Mar 28 08:07:26 2014
@@ -27,7 +27,8 @@ import org.apache.cayenne.access.jdbc.Co
 import org.apache.cayenne.access.jdbc.RowDescriptor;
 import org.apache.cayenne.access.jdbc.reader.RowReader;
 import org.apache.cayenne.access.jdbc.reader.RowReaderFactory;
-import org.apache.cayenne.crypto.cipher.CryptoHandler;
+import org.apache.cayenne.crypto.cipher.CryptoFactory;
+import org.apache.cayenne.crypto.cipher.Decryptor;
 import org.apache.cayenne.crypto.map.ColumnMapper;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.di.Inject;
@@ -37,70 +38,78 @@ import org.apache.cayenne.query.QueryMet
 
 public class CryptoRowReaderFactoryDecorator implements RowReaderFactory {
 
+    private static final MapEntryDecryptor[] EMPTY_DECRYPTORS = new 
MapEntryDecryptor[0];
+
     private RowReaderFactory delegate;
+    private CryptoFactory cryptoFactory;
     private ColumnMapper columnMapper;
-    private CryptoHandler cryptoHandler;
 
-    public CryptoRowReaderFactoryDecorator(@Inject RowReaderFactory delegate, 
@Inject CryptoHandler cryptoHandler,
+    public CryptoRowReaderFactoryDecorator(@Inject RowReaderFactory delegate, 
@Inject CryptoFactory cryptoFactory,
             @Inject ColumnMapper columnMapper) {
         this.delegate = delegate;
+        this.cryptoFactory = cryptoFactory;
         this.columnMapper = columnMapper;
-        this.cryptoHandler = cryptoHandler;
     }
 
     @Override
-    public RowReader<?> rowReader(RowDescriptor descriptor, QueryMetadata 
queryMetadata, DbAdapter adapter,
+    public RowReader<?> rowReader(final RowDescriptor descriptor, 
QueryMetadata queryMetadata, DbAdapter adapter,
             Map<ObjAttribute, ColumnDescriptor> attributeOverrides) {
 
-        List<ColumnDescriptor> encryptedColumns = null;
+        final RowReader<?> delegateReader = delegate.rowReader(descriptor, 
queryMetadata, adapter, attributeOverrides);
 
-        for (ColumnDescriptor cd : descriptor.getColumns()) {
+        return new RowReader<Object>() {
 
-            DbAttribute attribute = cd.getAttribute();
-            if (attribute != null && columnMapper.isEncrypted(attribute)) {
-                if (encryptedColumns == null) {
-                    encryptedColumns = new ArrayList<ColumnDescriptor>();
-                }
+            private int len;
+            private MapEntryDecryptor[] decryptors;
 
-                encryptedColumns.add(cd);
-            }
-        }
+            private void ensureDecryptorCompiled(Object row) {
+                if (decryptors == null) {
 
-        final RowReader<?> delegateReader = delegate.rowReader(descriptor, 
queryMetadata, adapter, attributeOverrides);
+                    List<MapEntryDecryptor> decList = null;
 
-        if (encryptedColumns == null) {
-            return delegateReader;
-        }
+                    if (row instanceof Map) {
 
-        final int len = encryptedColumns.size();
-        final String[] labels = new String[len];
-        final int[] types = new int[len];
-
-        for (int i = 0; i < len; i++) {
-            labels[i] = encryptedColumns.get(i).getDataRowKey();
-            types[i] = encryptedColumns.get(i).getJdbcType();
-        }
+                        ColumnDescriptor[] columns = descriptor.getColumns();
+                        int len = columns.length;
 
-        return new RowReader<Object>() {
-            private Boolean canDecrypt;
+                        for (int i = 0; i < len; i++) {
+
+                            DbAttribute a = columns[i].getAttribute();
+                            if (a != null && columnMapper.isEncrypted(a)) {
+                                if (decList == null) {
+                                    decList = new 
ArrayList<MapEntryDecryptor>(len - i);
+                                }
+
+                                decList.add(new 
MapEntryDecryptor(columns[i].getDataRowKey(), cryptoFactory
+                                        .getDecryptor(a)));
+                            }
+                        }
+
+                    }
+
+                    this.decryptors = decList == null ? EMPTY_DECRYPTORS : 
decList
+                            .toArray(new MapEntryDecryptor[decList.size()]);
+                    this.len = decryptors.length;
+                }
+            }
 
             @Override
             public Object readRow(ResultSet resultSet) {
                 Object row = delegateReader.readRow(resultSet);
 
-                if (canDecrypt == null) {
-                    canDecrypt = row instanceof Map;
-                }
+                ensureDecryptorCompiled(row);
 
-                if (canDecrypt) {
+                if (len > 0) {
                     @SuppressWarnings({ "unchecked", "rawtypes" })
                     Map<String, Object> map = (Map) row;
 
                     for (int i = 0; i < len; i++) {
-                        Object encrypted = map.get(labels[i]);
+
+                        MapEntryDecryptor decryptor = decryptors[i];
+                        Object encrypted = map.get(decryptor.key);
 
                         if (encrypted != null) {
-                            map.put(labels[i], 
cryptoHandler.decrypt(encrypted, types[i]));
+                            map.put(decryptor.key, 
decryptor.decryptor.decrypt(encrypted));
                         }
                     }
                 }
@@ -110,4 +119,13 @@ public class CryptoRowReaderFactoryDecor
         };
     }
 
+    class MapEntryDecryptor {
+        final String key;
+        final Decryptor decryptor;
+
+        MapEntryDecryptor(String key, Decryptor decryptor) {
+            this.key = key;
+            this.decryptor = decryptor;
+        }
+    }
 }

Modified: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Crypto_InRuntime_Test.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Crypto_InRuntime_Test.java?rev=1582631&r1=1582630&r2=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Crypto_InRuntime_Test.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Crypto_InRuntime_Test.java
 Fri Mar 28 08:07:26 2014
@@ -29,7 +29,7 @@ import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.crypto.db.Table1;
 import org.apache.cayenne.crypto.map.PatternColumnMapper;
-import org.apache.cayenne.crypto.unit.Rot13CryptoHandler;
+import org.apache.cayenne.crypto.unit.Rot13CryptoFactory;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
@@ -44,7 +44,7 @@ public class Crypto_InRuntime_Test exten
     @Override
     protected void setUp() throws Exception {
 
-        Module crypto = new 
CryptoModuleBuilder().cryptoHandler(Rot13CryptoHandler.class)
+        Module crypto = new 
CryptoModuleBuilder().cryptoFactory(Rot13CryptoFactory.class)
                 .columnMapper(new PatternColumnMapper("^CRYPTO_")).build();
 
         this.runtime = new ServerRuntime("cayenne-crypto.xml", crypto);
@@ -67,7 +67,7 @@ public class Crypto_InRuntime_Test exten
 
         Object[] data = table1.select();
         assertEquals("plain_1", data[1]);
-        assertEquals(Rot13CryptoHandler.rotate("crypto_1"), data[2]);
+        assertEquals(Rot13CryptoFactory.rotate("crypto_1"), data[2]);
     }
 
     public void testInsert_MultipleObjects() throws SQLException {
@@ -92,15 +92,15 @@ public class Crypto_InRuntime_Test exten
             cipherByPlain.put(r[1], r[2]);
         }
 
-        assertEquals(Rot13CryptoHandler.rotate("crypto_1"), 
cipherByPlain.get("a"));
-        assertEquals(Rot13CryptoHandler.rotate("crypto_2"), 
cipherByPlain.get("b"));
+        assertEquals(Rot13CryptoFactory.rotate("crypto_1"), 
cipherByPlain.get("a"));
+        assertEquals(Rot13CryptoFactory.rotate("crypto_2"), 
cipherByPlain.get("b"));
     }
 
     public void test_SelectQuery() throws SQLException {
 
-        table1.insert(1, "plain_1", Rot13CryptoHandler.rotate("crypto_1"));
-        table1.insert(2, "plain_2", Rot13CryptoHandler.rotate("crypto_2"));
-        table1.insert(3, "plain_3", Rot13CryptoHandler.rotate("crypto_3"));
+        table1.insert(1, "plain_1", Rot13CryptoFactory.rotate("crypto_1"));
+        table1.insert(2, "plain_2", Rot13CryptoFactory.rotate("crypto_2"));
+        table1.insert(3, "plain_3", Rot13CryptoFactory.rotate("crypto_3"));
 
         SelectQuery<Table1> select = SelectQuery.query(Table1.class);
         select.addOrdering(Table1.PLAIN_STRING.asc());

Copied: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactory.java
 (from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandler.java)
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactory.java?p2=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactory.java&p1=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandler.java&r1=1582630&r2=1582631&rev=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandler.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactory.java
 Fri Mar 28 08:07:26 2014
@@ -20,9 +20,15 @@ package org.apache.cayenne.crypto.unit;
 
 import java.io.UnsupportedEncodingException;
 
-import org.apache.cayenne.crypto.cipher.CryptoHandler;
+import org.apache.cayenne.crypto.cipher.CryptoFactory;
+import org.apache.cayenne.crypto.cipher.Decryptor;
+import org.apache.cayenne.crypto.cipher.Encryptor;
+import org.apache.cayenne.map.DbAttribute;
 
-public class Rot13CryptoHandler implements CryptoHandler {
+public class Rot13CryptoFactory implements CryptoFactory {
+
+    private Encryptor stringEncryptor;
+    private Decryptor stringDecryptor;
 
     public static String rotate(String value) {
         if (value == null) {
@@ -58,14 +64,31 @@ public class Rot13CryptoHandler implemen
         }
     }
 
-    @Override
-    public Object decrypt(Object ciphertext, int jdbcType) {
-        return rotate(ciphertext.toString());
+    public Rot13CryptoFactory() {
+        this.stringEncryptor = new Encryptor() {
+
+            @Override
+            public Object encrypt(Object plaintext) {
+                return plaintext != null ? rotate(plaintext.toString()) : null;
+            }
+        };
+
+        this.stringDecryptor = new Decryptor() {
+
+            @Override
+            public Object decrypt(Object ciphertext) {
+                return ciphertext != null ? rotate(ciphertext.toString()) : 
null;
+            }
+        };
     }
 
     @Override
-    public Object encrypt(Object plaintext, int jdbcType) {
-        return rotate(plaintext.toString());
+    public Encryptor getEncryptor(DbAttribute column) {
+        return stringEncryptor;
     }
 
+    @Override
+    public Decryptor getDecryptor(DbAttribute column) {
+        return stringDecryptor;
+    }
 }

Copied: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactoryTest.java
 (from r1582630, 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandlerTest.java)
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactoryTest.java?p2=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactoryTest.java&p1=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandlerTest.java&r1=1582630&r2=1582631&rev=1582631&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoHandlerTest.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13CryptoFactoryTest.java
 Fri Mar 28 08:07:26 2014
@@ -18,20 +18,22 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.unit;
 
-import java.sql.Types;
-
 import junit.framework.TestCase;
 
-public class Rot13CryptoHandlerTest extends TestCase {
+import org.apache.cayenne.map.DbAttribute;
+
+public class Rot13CryptoFactoryTest extends TestCase {
 
     public void testEncrypt() {
-        Rot13CryptoHandler handler = new Rot13CryptoHandler();
-        assertEquals("nop", handler.encrypt("abc", Types.VARCHAR));
+
+        Rot13CryptoFactory factory = new Rot13CryptoFactory();
+        assertEquals("nop", factory.getEncryptor(new 
DbAttribute()).encrypt("abc"));
     }
-    
+
     public void testDecrypt() {
-        Rot13CryptoHandler handler = new Rot13CryptoHandler();
-        assertEquals("nop", handler.decrypt("abc", Types.VARCHAR));
+
+        Rot13CryptoFactory factory = new Rot13CryptoFactory();
+        assertEquals("nop", factory.getDecryptor(new 
DbAttribute()).decrypt("abc"));
     }
 
 }


Reply via email to