Repository: cayenne
Updated Branches:
  refs/heads/master a5b833d5f -> aecf9aa31


CAY-2107 cayenne-crypto: Lazy initialization of crypto subsystem


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/3d96be62
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/3d96be62
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/3d96be62

Branch: refs/heads/master
Commit: 3d96be6237382993a06c35a1071403cb5bd6cad7
Parents: a5b833d
Author: Andrus Adamchik <[email protected]>
Authored: Thu Aug 25 11:54:10 2016 +0300
Committer: Andrus Adamchik <[email protected]>
Committed: Thu Aug 25 11:54:37 2016 +0300

----------------------------------------------------------------------
 .../cayenne/crypto/CryptoModuleBuilder.java     |  7 +++
 .../bytes/LazyBytesTransformerFactory.java      | 62 +++++++++++++++++++
 .../value/LazyValueTransformerFactory.java      | 64 ++++++++++++++++++++
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  3 +-
 4 files changed, 135 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/3d96be62/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
----------------------------------------------------------------------
diff --git 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
index 151e320..4162409 100644
--- 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
+++ 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
@@ -32,6 +32,7 @@ import 
org.apache.cayenne.crypto.transformer.DefaultTransformerFactory;
 import org.apache.cayenne.crypto.transformer.TransformerFactory;
 import org.apache.cayenne.crypto.transformer.bytes.BytesTransformerFactory;
 import 
org.apache.cayenne.crypto.transformer.bytes.DefaultBytesTransformerFactory;
+import org.apache.cayenne.crypto.transformer.bytes.LazyBytesTransformerFactory;
 import org.apache.cayenne.crypto.transformer.value.Base64StringConverter;
 import org.apache.cayenne.crypto.transformer.value.BigDecimalConverter;
 import org.apache.cayenne.crypto.transformer.value.BigIntegerConverter;
@@ -43,6 +44,7 @@ import 
org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactor
 import org.apache.cayenne.crypto.transformer.value.DoubleConverter;
 import org.apache.cayenne.crypto.transformer.value.FloatConverter;
 import org.apache.cayenne.crypto.transformer.value.IntegerConverter;
+import org.apache.cayenne.crypto.transformer.value.LazyValueTransformerFactory;
 import org.apache.cayenne.crypto.transformer.value.LongConverter;
 import org.apache.cayenne.crypto.transformer.value.ShortConverter;
 import org.apache.cayenne.crypto.transformer.value.Utf8StringConverter;
@@ -380,6 +382,11 @@ public class CryptoModuleBuilder {
 
                 
binder.decorate(BatchTranslatorFactory.class).before(CryptoBatchTranslatorFactoryDecorator.class);
                 
binder.decorate(RowReaderFactory.class).before(CryptoRowReaderFactoryDecorator.class);
+
+                // decorate our own services to allow Cayenne to operate over 
plaintext entities
+                // even if crypto keys are not available.
+                
binder.decorate(ValueTransformerFactory.class).after(LazyValueTransformerFactory.class);
+                
binder.decorate(BytesTransformerFactory.class).after(LazyBytesTransformerFactory.class);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3d96be62/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/LazyBytesTransformerFactory.java
----------------------------------------------------------------------
diff --git 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/LazyBytesTransformerFactory.java
 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/LazyBytesTransformerFactory.java
new file mode 100644
index 0000000..ee7a3ad
--- /dev/null
+++ 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/LazyBytesTransformerFactory.java
@@ -0,0 +1,62 @@
+/*****************************************************************
+ *   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.transformer.bytes;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+
+/**
+ * A decorator of {@link BytesTransformerFactory} that allows to defer its 
initialization and hence allows Cayenne stack
+ * to operate without crypto keys over a subset of entities that do not 
require encryption. Useful e.g. when the crypto
+ * keys are supplied at a later point after startup.
+ *
+ * @since 4.0
+ */
+public class LazyBytesTransformerFactory implements BytesTransformerFactory {
+
+    private Provider<BytesTransformerFactory> delegateProvider;
+    private volatile BytesTransformerFactory delegate;
+
+    public LazyBytesTransformerFactory(@Inject 
Provider<BytesTransformerFactory> delegateProvider) {
+        this.delegateProvider = delegateProvider;
+    }
+
+    @Override
+    public BytesEncryptor encryptor() {
+        return ensureInit().encryptor();
+    }
+
+    @Override
+    public BytesDecryptor decryptor() {
+        return ensureInit().decryptor();
+    }
+
+    protected BytesTransformerFactory ensureInit() {
+
+        if (delegate == null) {
+            synchronized (this) {
+                if (delegate == null) {
+                    delegate = delegateProvider.get();
+                }
+            }
+        }
+
+        return delegate;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3d96be62/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LazyValueTransformerFactory.java
----------------------------------------------------------------------
diff --git 
a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LazyValueTransformerFactory.java
 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LazyValueTransformerFactory.java
new file mode 100644
index 0000000..62c4529
--- /dev/null
+++ 
b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LazyValueTransformerFactory.java
@@ -0,0 +1,64 @@
+/*****************************************************************
+ *   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.transformer.value;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+import org.apache.cayenne.map.DbAttribute;
+
+/**
+ * A {@link ValueTransformerFactory} that  allows to defer its initialization 
and hence allows Cayenne stack
+ * to operate without cryto keys over a subset of entities that do not require 
encryption. Useful e.g. when the
+ * crypto keys are supplied at a later point after startup.
+ *
+ * @since 4.0
+ */
+public class LazyValueTransformerFactory implements ValueTransformerFactory {
+
+    private Provider<ValueTransformerFactory> delegateProvider;
+    private volatile ValueTransformerFactory delegate;
+
+    public LazyValueTransformerFactory(@Inject 
Provider<ValueTransformerFactory> delegateProvider) {
+        this.delegateProvider = delegateProvider;
+    }
+
+    @Override
+    public ValueEncryptor encryptor(DbAttribute a) {
+        return ensureInit().encryptor(a);
+    }
+
+    @Override
+    public ValueDecryptor decryptor(DbAttribute a) {
+        return ensureInit().decryptor(a);
+    }
+
+    protected ValueTransformerFactory ensureInit() {
+
+        if (delegate == null) {
+            synchronized (this) {
+                if (delegate == null) {
+                    delegate = delegateProvider.get();
+                }
+            }
+        }
+
+        return delegate;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3d96be62/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt 
b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index cd3d28a..e65f57c 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -27,7 +27,8 @@ CAY-2090 Untangle HttpRemoteService from ServiceContext 
thread local setup
 CAY-2100 Add supporting generated keys for PostgreSQL
 CAY-2102 EJBQL: db: path not supported in select columns
 CAY-2103 cayenne-crypto: support for mapping non-String and non-binary types
-CAY-2106: cayenne-crypto: allow DI contribution of type converters inside 
ValueTransformerFactory
+CAY-2106 cayenne-crypto: allow DI contribution of type converters inside 
ValueTransformerFactory
+CAY-2107 cayenne-crypto: Lazy initialization of crypto subsystem
 
 Bug Fixes:
 

Reply via email to