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:
