All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.http.osgi.impl.PropertiesUtils Maven / Gradle / Ivy

There is a newer version: 4.5.14
Show newest version
/*
 * ====================================================================
 * 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.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * .
 *
 */
package org.apache.http.osgi.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @since 4.3
 */
final class PropertiesUtils {

    private static final Map, PropertyConverter> CONVERTERS_REGISTRY =
                    new HashMap, PropertiesUtils.PropertyConverter>();

    static {
        register(new BooleanPropertyConverter(), boolean.class, Boolean.class);
        register(new StringPropertyConverter(), String.class);
        register(new StringArrayPropertyConverter(), String[].class);
        register(new IntegerPropertyConverter(), int.class, Integer.class);
        register(new LongPropertyConverter(), long.class, Long.class);
        register(new DoublePropertyConverter(), double.class, Double.class);
    }

    private static void register(final PropertyConverter converter, final Class...targetTypes) {
        for (final Class targetType : targetTypes) {
            CONVERTERS_REGISTRY.put(targetType, converter);
        }
    }

    public static  T to(final Object propValue, final Class targetType, final T defaultValue) {
        Object v = propValue;
        if (v == null) {
            return defaultValue;
        }

        if (!targetType.isArray()) {
            v = toObject(v);
        }

        if (targetType.isInstance(v)) {
            return targetType.cast(v);
        }

        if (CONVERTERS_REGISTRY.containsKey(targetType)) {
            @SuppressWarnings("unchecked") final // type driven by targetType
            PropertyConverter converter = (PropertyConverter) CONVERTERS_REGISTRY.get(targetType);
            try {
                return converter.to(v);
            } catch (final Exception ignore) {
            }
        }

        return defaultValue;
    }

    /**
     * Returns the parameter as a single value. If the
     * parameter is neither an array nor a java.util.Collection the
     * parameter is returned unmodified. If the parameter is a non-empty array,
     * the first array element is returned. If the property is a non-empty
     * java.util.Collection, the first collection element is returned.
     *
     * @param propValue the parameter to convert.
     */
    private static Object toObject(final Object propValue) {
       if (propValue.getClass().isArray()) {
           final Object[] prop = (Object[]) propValue;
           return prop.length > 0 ? prop[0] : null;
       }

       if (propValue instanceof Collection) {
           final Collection prop = (Collection) propValue;
           return prop.isEmpty() ? null : prop.iterator().next();
       }

       return propValue;
    }

    /**
     * Hidden constructor, this class must not be instantiated.
     */
    private PropertiesUtils() {
        // do nothing
    }

    private static interface PropertyConverter {

        T to(Object propValue);

    }

    private static class BooleanPropertyConverter implements PropertyConverter {

        public Boolean to(final Object propValue) {
            return Boolean.valueOf(String.valueOf(propValue));
        }

    }

    private static class StringPropertyConverter implements PropertyConverter {

        public String to(final Object propValue) {
            return String.valueOf(propValue);
        }

    }

    private static class StringArrayPropertyConverter implements PropertyConverter {

        public String[] to(final Object propValue) {
            if (propValue instanceof String) {
                // single string
                return new String[] { (String) propValue };
            }

            if (propValue.getClass().isArray()) {
                // other array
                final Object[] valueArray = (Object[]) propValue;
                final List values = new ArrayList(valueArray.length);
                for (final Object value : valueArray) {
                    if (value != null) {
                        values.add(value.toString());
                    }
                }
                return values.toArray(new String[values.size()]);

            }

            if (propValue instanceof Collection) {
                // collection
                final Collection valueCollection = (Collection) propValue;
                final List valueList = new ArrayList(valueCollection.size());
                for (final Object value : valueCollection) {
                    if (value != null) {
                        valueList.add(value.toString());
                    }
                }
                return valueList.toArray(new String[valueList.size()]);
            }

            // don't care, fall through to default value
            throw new IllegalArgumentException();
        }

    }

    private static class IntegerPropertyConverter implements PropertyConverter {

        public Integer to(final Object propValue) {
            return Integer.valueOf(String.valueOf(propValue));
        }

    }

    private static class LongPropertyConverter implements PropertyConverter {

        public Long to(final Object propValue) {
            return Long.valueOf(String.valueOf(propValue));
        }

    }

    private static class DoublePropertyConverter implements PropertyConverter {

        public Double to(final Object propValue) {
            return Double.valueOf(String.valueOf(propValue));
        }

    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy