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"));
}
}