You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2017/10/12 10:27:23 UTC

incubator-tamaya git commit: TAMAYA-260 Fixed MP Optional and Provider injection (and a corresponding issue in core in the Optional converter).

Repository: incubator-tamaya
Updated Branches:
  refs/heads/master 76524b2e4 -> cd43cfacd


TAMAYA-260 Fixed MP Optional and Provider injection (and a corresponding issue in core in the Optional converter).


Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/cd43cfac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/cd43cfac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/cd43cfac

Branch: refs/heads/master
Commit: cd43cfacd837d2adae7c61ff29b4e51ceee7dd21
Parents: 76524b2
Author: Anatole Tresch <an...@apache.org>
Authored: Thu Oct 12 11:46:47 2017 +0200
Committer: Anatole Tresch <an...@apache.org>
Committed: Thu Oct 12 11:47:34 2017 +0200

----------------------------------------------------------------------
 .../apache/tamaya/spi/ConversionContext.java    | 14 ++++-
 .../internal/converters/OptionalConverter.java  | 65 +++++++++++++++-----
 2 files changed, 62 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/cd43cfac/code/api/src/main/java/org/apache/tamaya/spi/ConversionContext.java
----------------------------------------------------------------------
diff --git a/code/api/src/main/java/org/apache/tamaya/spi/ConversionContext.java b/code/api/src/main/java/org/apache/tamaya/spi/ConversionContext.java
index 0bfda0b..4553e52 100644
--- a/code/api/src/main/java/org/apache/tamaya/spi/ConversionContext.java
+++ b/code/api/src/main/java/org/apache/tamaya/spi/ConversionContext.java
@@ -141,7 +141,7 @@ public class ConversionContext {
         /** The accessed key, or null. */
         private String key;
         /** The target type. */
-        private final TypeLiteral<?> targetType;
+        private TypeLiteral<?> targetType;
         /** The injection target (only set with injection used). */
         private AnnotatedElement annotatedElement;
         /** The ordered list of formats tried. */
@@ -219,6 +219,17 @@ public class ConversionContext {
         }
 
         /**
+         * Sets the target type explicitly. This is required in some rare cases, e.g. injection of {@code Provider}
+         * instances, where the provider's result type must be produced.
+         * @param targetType the
+         * @return the builder for chaining.
+         */
+        public Builder setTargetType(TypeLiteral targetType) {
+            this.targetType = Objects.requireNonNull(targetType);
+            return this;
+        }
+
+        /**
          * Add the formats provided by a {@link PropertyConverter}. This method should be called by each converter
          * performing/trying conversion, so the user can be given feedback on the supported formats on failure.
          * @param converterType the converter type, not {@code null}.
@@ -251,5 +262,6 @@ public class ConversionContext {
                     ", supportedFormats=" + supportedFormats +
                     '}';
         }
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/cd43cfac/code/core/src/main/java/org/apache/tamaya/core/internal/converters/OptionalConverter.java
----------------------------------------------------------------------
diff --git a/code/core/src/main/java/org/apache/tamaya/core/internal/converters/OptionalConverter.java b/code/core/src/main/java/org/apache/tamaya/core/internal/converters/OptionalConverter.java
index 2213bcc..58fe898 100644
--- a/code/core/src/main/java/org/apache/tamaya/core/internal/converters/OptionalConverter.java
+++ b/code/core/src/main/java/org/apache/tamaya/core/internal/converters/OptionalConverter.java
@@ -18,16 +18,22 @@
  */
 package org.apache.tamaya.core.internal.converters;
 
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.ConfigQuery;
+import org.apache.tamaya.Configuration;
 import org.apache.tamaya.TypeLiteral;
 import org.apache.tamaya.core.internal.PropertyConverterManager;
 import org.apache.tamaya.spi.ConversionContext;
 import org.apache.tamaya.spi.PropertyConverter;
 import org.osgi.service.component.annotations.Component;
 
+import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.Locale;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
@@ -36,24 +42,18 @@ import java.util.logging.Logger;
 @Component(service = PropertyConverter.class)
 public class OptionalConverter implements PropertyConverter<Optional> {
 
-    private final Logger LOG = Logger.getLogger(getClass().getName());
+    private static final Logger LOG = Logger.getLogger(OptionalConverter.class.getName());
 
     @Override
-    public Optional<?> convert(String value, ConversionContext context) {
-        TypeLiteral<Optional> target = (TypeLiteral<Optional>)context.getTargetType();
-        Object result = null;
-        Type targetType = TypeLiteral.getTypeParameters(target.getType())[0];
-        if(String.class.equals(targetType)){
-            result = value;
+    public Optional convert(String value, ConversionContext context) {
+        try{
+            Type targetType = context.getTargetType().getType();
+            ParameterizedType pt = (ParameterizedType) targetType;
+            ConvertQuery converter = new ConvertQuery(value, TypeLiteral.of(pt.getActualTypeArguments()[0]));
+            return Optional.ofNullable(context.getConfiguration().query(converter));
+        }catch(Exception e){
+            throw new ConfigException("Error evaluating config value.", e);
         }
-        for(PropertyConverter pv:context.getConfigurationContext().getPropertyConverters(
-                TypeLiteral.of(targetType))){
-            result = pv.convert(value, context);
-            if(result!=null){
-                return Optional.of(result);
-            }
-        }
-        return Optional.ofNullable(result);
     }
 
     @Override
@@ -65,4 +65,37 @@ public class OptionalConverter implements PropertyConverter<Optional> {
     public int hashCode(){
         return getClass().hashCode();
     }
+
+
+    private static final class ConvertQuery<T> implements ConfigQuery<T>{
+
+        private String rawValue;
+        private TypeLiteral<T> type;
+
+        public ConvertQuery(String rawValue, TypeLiteral<T> type) {
+            this.rawValue = Objects.requireNonNull(rawValue);
+            this.type = Objects.requireNonNull(type);
+        }
+
+        @Override
+        public T query(Configuration config) {
+            List<PropertyConverter<T>> converters = config.getContext().getPropertyConverters(type);
+            ConversionContext context = new ConversionContext.Builder(type).setConfigurationContext(config.getContext())
+                    .setConfiguration(config).setKey(ConvertQuery.class.getName()).build();
+            for(PropertyConverter<?> conv: converters) {
+                try{
+                    if(conv instanceof OptionalConverter){
+                        continue;
+                    }
+                    T result = (T)conv.convert(rawValue, context);
+                    if(result!=null){
+                        return result;
+                    }
+                }catch(Exception e){
+                    LOG.log(Level.FINEST,  e, () -> "Converter "+ conv +" failed to convert to " + type);
+                }
+            }
+            return null;
+        }
+    }
 }