You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by st...@apache.org on 2015/01/03 19:07:46 UTC

[5/9] incubator-tamaya git commit: remove files we don't have the full copyright!

remove files we don't have the full copyright!

We shall not use code which we did not write ourself!


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

Branch: refs/heads/master
Commit: 3e1a7a51540b6f43a0548fb9b9f23dc69a4324ad
Parents: 4af87fc
Author: Mark Struberg <st...@apache.org>
Authored: Sat Jan 3 18:11:56 2015 +0100
Committer: Mark Struberg <st...@apache.org>
Committed: Sat Jan 3 18:11:56 2015 +0100

----------------------------------------------------------------------
 .../org/apache/tamaya/core/util/ClassUtils.java | 1102 ------------------
 .../apache/tamaya/core/util/StringUtils.java    |  473 --------
 2 files changed, 1575 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/3e1a7a51/core/src/main/java/org/apache/tamaya/core/util/ClassUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/util/ClassUtils.java b/core/src/main/java/org/apache/tamaya/core/util/ClassUtils.java
deleted file mode 100644
index 9e7e6d9..0000000
--- a/core/src/main/java/org/apache/tamaya/core/util/ClassUtils.java
+++ /dev/null
@@ -1,1102 +0,0 @@
-/*
-* Copyright 2002-2014 the original author or authors.
-*
-* Licensed 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.tamaya.core.util;
-
-import org.apache.tamaya.core.internal.resource.ReflectionUtils;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Proxy;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Miscellaneous class utility methods.
- * Mainly for internal use within the framework.
- *
- * @author Juergen Hoeller
- * @author Keith Donald
- * @author Rob Harrop
- * @author Sam Brannen
- * @since 1.1
- */
-public final class ClassUtils {
-
-    /**
-     * Suffix for array class names: "[]"
-     */
-    public static final String ARRAY_SUFFIX = "[]";
-
-    /**
-     * Prefix for internal array class names: "["
-     */
-    private static final String INTERNAL_ARRAY_PREFIX = "[";
-
-    /**
-     * Prefix for internal non-primitive array class names: "[L"
-     */
-    private static final String NON_PRIMITIVE_ARRAY_PREFIX = "[L";
-
-    /**
-     * The package separator character '.'
-     */
-    private static final char PACKAGE_SEPARATOR = '.';
-
-    /**
-     * The path separator character '/'
-     */
-    private static final char PATH_SEPARATOR = '/';
-
-    /**
-     * The inner class separator character '$'
-     */
-    private static final char INNER_CLASS_SEPARATOR = '$';
-
-    /**
-     * Map with primitive wrapper type as key and corresponding primitive
-     * type as keys, for example: Integer.class -> int.class.
-     */
-    private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_TYPE_MAP = new HashMap<>(8);
-
-    /**
-     * Map with primitive type as key and corresponding wrapper
-     * type as keys, for example: int.class -> Integer.class.
-     */
-    private static final Map<Class<?>, Class<?>> PRIMITIVE_TYPE_TO_WRAPPER_MAP = new HashMap<>(8);
-
-    /**
-     * Map with primitive type name as key and corresponding primitive
-     * type as keys, for example: "int" -> "int.class".
-     */
-    private static final Map<String, Class<?>> PRIMITIVE_TYPE_NAME_MAP = new HashMap<>(32);
-
-
-    static {
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Boolean.class, boolean.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Byte.class, byte.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Character.class, char.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Double.class, double.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Float.class, float.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Integer.class, int.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Long.class, long.class);
-        PRIMITIVE_WRAPPER_TYPE_MAP.put(Short.class, short.class);
-
-        for (Map.Entry<Class<?>, Class<?>> entry : PRIMITIVE_WRAPPER_TYPE_MAP.entrySet()) {
-            PRIMITIVE_TYPE_TO_WRAPPER_MAP.put(entry.getValue(), entry.getKey());
-        }
-
-        Set<Class<?>> primitiveTypes = new HashSet<>(32);
-        primitiveTypes.addAll(PRIMITIVE_WRAPPER_TYPE_MAP.values());
-        primitiveTypes.addAll(Arrays.asList(new Class<?>[]{
-                boolean[].class, byte[].class, char[].class, double[].class,
-                float[].class, int[].class, long[].class, short[].class}));
-        primitiveTypes.add(void.class);
-        for (Class<?> primitiveType : primitiveTypes) {
-            PRIMITIVE_TYPE_NAME_MAP.put(primitiveType.getName(), primitiveType);
-        }
-    }
-
-    /**
-     * Private singleton constructor.
-     */
-    private ClassUtils() {
-    }
-
-
-    /**
-     * Return the default ClassLoader to use: typically the thread context
-     * ClassLoader, if available; the ClassLoader that loaded the ClassUtils
-     * class will be used as fallback.
-     * <p>Call this method if you intend to use the thread context ClassLoader
-     * in a scenario where you clearly prefer a non-null ClassLoader reference:
-     * for example, for class path resource loading (but not necessarily for
-     * {@code Class.forName}, which accepts a {@code null} ClassLoader
-     * reference as well).
-     *
-     * @return the default ClassLoader (only {@code null} if even the system
-     * ClassLoader isn't accessible)
-     * @see Thread#getContextClassLoader()
-     * @see ClassLoader#getSystemClassLoader()
-     */
-    public static ClassLoader getDefaultClassLoader() {
-        ClassLoader cl = null;
-        try {
-            cl = Thread.currentThread().getContextClassLoader();
-        } catch (Throwable ex) {
-            // Cannot access thread context ClassLoader - falling back...
-        }
-        if (cl == null) {
-            // No thread context class loader -> use class loader current this class.
-            cl = ClassUtils.class.getClassLoader();
-            if (cl == null) {
-                // getClassLoader() returning null indicates the bootstrap ClassLoader
-                try {
-                    cl = ClassLoader.getSystemClassLoader();
-                } catch (Throwable ex) {
-                    // Cannot access system ClassLoader - oh well, maybe the caller can live with null...
-                }
-            }
-        }
-        return cl;
-    }
-
-    /**
-     * Replacement for {@code Class.forName()} that also returns Class instances
-     * for primitives (e.g. "int") and array class names (e.g. "String[]").
-     * Furthermore, it is also capable current resolving inner class names in Java source
-     * style (e.g. "java.lang.Thread.State" instead current "java.lang.Thread$State").
-     *
-     * @param name        the name current the Class
-     * @param classLoader the class loader to use
-     *                    (may be {@code null}, which indicates the default class loader)
-     * @return Class instance for the supplied name
-     * @throws ClassNotFoundException if the class was not found
-     * @throws LinkageError           if the class file could not be loaded
-     * @see Class#forName(String, boolean, ClassLoader)
-     */
-    public static Class<?> forName(String name, ClassLoader classLoader) throws ClassNotFoundException, LinkageError {
-        Objects.requireNonNull(name, "Name must not be null");
-
-        Class<?> clazz = resolvePrimitiveClassName(name);
-        if (clazz != null) {
-            return clazz;
-        }
-
-        // "java.lang.String[]" style arrays
-        if (name.endsWith(ARRAY_SUFFIX)) {
-            String elementClassName = name.substring(0, name.length() - ARRAY_SUFFIX.length());
-            Class<?> elementClass = forName(elementClassName, classLoader);
-            return Array.newInstance(elementClass, 0).getClass();
-        }
-
-        // "[Ljava.lang.String;" style arrays
-        if (name.startsWith(NON_PRIMITIVE_ARRAY_PREFIX) && name.endsWith(";")) {
-            String elementName = name.substring(NON_PRIMITIVE_ARRAY_PREFIX.length(), name.length() - 1);
-            Class<?> elementClass = forName(elementName, classLoader);
-            return Array.newInstance(elementClass, 0).getClass();
-        }
-
-        // "[[I" or "[[Ljava.lang.String;" style arrays
-        if (name.startsWith(INTERNAL_ARRAY_PREFIX)) {
-            String elementName = name.substring(INTERNAL_ARRAY_PREFIX.length());
-            Class<?> elementClass = forName(elementName, classLoader);
-            return Array.newInstance(elementClass, 0).getClass();
-        }
-
-        ClassLoader clToUse = classLoader;
-        if (clToUse == null) {
-            clToUse = getDefaultClassLoader();
-        }
-        try {
-            return (clToUse != null ? clToUse.loadClass(name) : Class.forName(name));
-        } catch (ClassNotFoundException ex) {
-            int lastDotIndex = name.lastIndexOf(PACKAGE_SEPARATOR);
-            if (lastDotIndex != -1) {
-                String innerClassName =
-                        name.substring(0, lastDotIndex) + INNER_CLASS_SEPARATOR + name.substring(lastDotIndex + 1);
-                try {
-                    return (clToUse != null ? clToUse.loadClass(innerClassName) : Class.forName(innerClassName));
-                } catch (ClassNotFoundException ex2) {
-                    // Swallow - let original exception get through
-                }
-            }
-            throw ex;
-        }
-    }
-
-
-    /**
-     * Resolve the given class name as primitive class, if appropriate,
-     * according to the JVM's naming rules for primitive classes.
-     * <p>Also supports the JVM's internal class names for primitive arrays.
-     * Does <i>not</i> support the "[]" suffix notation for primitive arrays;
-     * this is only supported by {@link #forName(String, ClassLoader)}.
-     *
-     * @param name the name current the potentially primitive class
-     * @return the primitive class, or {@code null} if the name does not denote
-     * a primitive class or primitive array class
-     */
-    public static Class<?> resolvePrimitiveClassName(String name) {
-        Class<?> result = null;
-        // Most class names will be quite long, considering that they
-        // SHOULD sit in a package, so a length check is worthwhile.
-        if (name != null && name.length() <= 8) {
-            // Could be a primitive - likely.
-            result = PRIMITIVE_TYPE_NAME_MAP.get(name);
-        }
-        return result;
-    }
-
-    /**
-     * Determine whether the {@link Class} identified by the supplied name is present
-     * and can be loaded. Will return {@code false} if either the class or
-     * one current its dependencies is not present or cannot be loaded.
-     *
-     * @param className   the name current the class to check
-     * @param classLoader the class loader to use
-     *                    (may be {@code null}, which indicates the default class loader)
-     * @return whether the specified class is present
-     */
-    public static boolean isPresent(String className, ClassLoader classLoader) {
-        try {
-            forName(className, classLoader);
-            return true;
-        } catch (Throwable ex) {
-            // Class or one current its dependencies is not present...
-            return false;
-        }
-    }
-
-
-    /**
-     * Check whether the given class is cache-safe in the given context,
-     * i.e. whether it is loaded by the given ClassLoader or a parent current it.
-     *
-     * @param clazz       the class to analyze
-     * @param classLoader the ClassLoader to potentially cache metadata in
-     */
-    public static boolean isCacheSafe(Class<?> clazz, ClassLoader classLoader) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        try {
-            ClassLoader target = clazz.getClassLoader();
-            if (target == null) {
-                return true;
-            }
-            ClassLoader cur = classLoader;
-            if (cur == target) {
-                return true;
-            }
-            while (cur != null) {
-                cur = cur.getParent();
-                if (cur == target) {
-                    return true;
-                }
-            }
-            return false;
-        } catch (SecurityException ex) {
-            // Probably from the system ClassLoader - let's consider it safe.
-            return true;
-        }
-    }
-
-
-    /**
-     * Return the qualified name current the given class: usually simply
-     * the class name, but component type class name + "[]" for arrays.
-     *
-     * @param clazz the class
-     * @return the qualified name current the class
-     */
-    public static String getQualifiedName(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        if (clazz.isArray()) {
-            return getQualifiedNameForArray(clazz);
-        } else {
-            return clazz.getName();
-        }
-    }
-
-    /**
-     * Build a nice qualified name for an array:
-     * component type class name + "[]".
-     *
-     * @param clazz the array class
-     * @return a qualified name for the array class
-     */
-    private static String getQualifiedNameForArray(Class<?> clazz) {
-        StringBuilder result = new StringBuilder();
-        while (clazz.isArray()) {
-            clazz = clazz.getComponentType();
-            result.append(ClassUtils.ARRAY_SUFFIX);
-        }
-        result.insert(0, clazz.getName());
-        return result.toString();
-    }
-
-    /**
-     * Return the qualified name current the given method, consisting current
-     * fully qualified interface/class name + "." + method name.
-     *
-     * @param method the method
-     * @return the qualified name current the method
-     */
-    public static String getQualifiedMethodName(Method method) {
-        Objects.requireNonNull(method, "Method must not be null");
-        return method.getDeclaringClass().getName() + "." + method.getName();
-    }
-
-    /**
-     * Return a descriptive name for the given object's type: usually simply
-     * the class name, but component type class name + "[]" for arrays,
-     * and an appended list current implemented interfaces for JDK proxies.
-     *
-     * @param keys the keys to introspect
-     * @return the qualified name current the class
-     */
-    public static String getDescriptiveType(Object keys) {
-        if (keys == null) {
-            return null;
-        }
-        Class<?> clazz = keys.getClass();
-        if (Proxy.isProxyClass(clazz)) {
-            StringBuilder result = new StringBuilder(clazz.getName());
-            result.append(" implementing ");
-            Class<?>[] ifcs = clazz.getInterfaces();
-            for (int i = 0; i < ifcs.length; i++) {
-                result.append(ifcs[i].getName());
-                if (i < ifcs.length - 1) {
-                    result.append(',');
-                }
-            }
-            return result.toString();
-        } else if (clazz.isArray()) {
-            return getQualifiedNameForArray(clazz);
-        } else {
-            return clazz.getName();
-        }
-    }
-
-    /**
-     * Check whether the given class matches the user-specified type name.
-     *
-     * @param clazz    the class to check
-     * @param typeName the type name to match
-     */
-    public static boolean matchesTypeName(Class<?> clazz, String typeName) {
-        return (typeName != null &&
-                (typeName.equals(clazz.getName()) || typeName.equals(clazz.getSimpleName()) ||
-                        (clazz.isArray() && typeName.equals(getQualifiedNameForArray(clazz)))));
-    }
-
-
-    /**
-     * Determine whether the given class has a public constructor with the given signature.
-     * <p>Essentially translates {@code NoSuchMethodException} to "false".
-     *
-     * @param clazz      the clazz to analyze
-     * @param paramTypes the parameter types current the method
-     * @return whether the class has a corresponding constructor
-     * @see Class#getMethod
-     */
-    public static boolean hasConstructor(Class<?> clazz, Class<?>... paramTypes) {
-        return (getConstructorIfAvailable(clazz, paramTypes) != null);
-    }
-
-    /**
-     * Determine whether the given class has a public constructor with the given signature,
-     * and return it if available (else return {@code null}).
-     * <p>Essentially translates {@code NoSuchMethodException} to {@code null}.
-     *
-     * @param clazz      the clazz to analyze
-     * @param paramTypes the parameter types current the method
-     * @return the constructor, or {@code null} if not found
-     * @see Class#getConstructor
-     */
-    public static <T> Constructor<T> getConstructorIfAvailable(Class<T> clazz, Class<?>... paramTypes) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        try {
-            return clazz.getConstructor(paramTypes);
-        } catch (NoSuchMethodException ex) {
-            return null;
-        }
-    }
-
-    /**
-     * Determine whether the given class has a public method with the given signature.
-     * <p>Essentially translates {@code NoSuchMethodException} to "false".
-     *
-     * @param clazz      the clazz to analyze
-     * @param methodName the name current the method
-     * @param paramTypes the parameter types current the method
-     * @return whether the class has a corresponding method
-     * @see Class#getMethod
-     */
-    public static boolean hasMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) {
-        return (getMethodIfAvailable(clazz, methodName, paramTypes) != null);
-    }
-
-    /**
-     * Determine whether the given class has a public method with the given signature,
-     * and return it if available (else throws an {@code IllegalStateException}).
-     * <p>In case current any signature specified, only returns the method if there is a
-     * unique candidate, i.e. a single public method with the specified name.
-     * <p>Essentially translates {@code NoSuchMethodException} to {@code IllegalStateException}.
-     *
-     * @param clazz      the clazz to analyze
-     * @param methodName the name current the method
-     * @param paramTypes the parameter types current the method
-     *                   (may be {@code null} to indicate any signature)
-     * @return the method (never {@code null})
-     * @throws IllegalStateException if the method has not been found
-     * @see Class#getMethod
-     */
-    public static Method getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        Objects.requireNonNull(methodName, "Method name must not be null");
-        if (paramTypes != null) {
-            try {
-                return clazz.getMethod(methodName, paramTypes);
-            } catch (NoSuchMethodException ex) {
-                throw new IllegalStateException("Expected method not found: " + ex);
-            }
-        } else {
-            Set<Method> candidates = new HashSet<Method>(1);
-            Method[] methods = clazz.getMethods();
-            for (Method method : methods) {
-                if (methodName.equals(method.getName())) {
-                    candidates.add(method);
-                }
-            }
-            if (candidates.size() == 1) {
-                return candidates.iterator().next();
-            } else if (candidates.isEmpty()) {
-                throw new IllegalStateException("Expected method not found: " + clazz + "." + methodName);
-            } else {
-                throw new IllegalStateException("No unique method found: " + clazz + "." + methodName);
-            }
-        }
-    }
-
-    /**
-     * Determine whether the given class has a public method with the given signature,
-     * and return it if available (else return {@code null}).
-     * <p>In case current any signature specified, only returns the method if there is a
-     * unique candidate, i.e. a single public method with the specified name.
-     * <p>Essentially translates {@code NoSuchMethodException} to {@code null}.
-     *
-     * @param clazz      the clazz to analyze
-     * @param methodName the name current the method
-     * @param paramTypes the parameter types current the method
-     *                   (may be {@code null} to indicate any signature)
-     * @return the method, or {@code null} if not found
-     * @see Class#getMethod
-     */
-    public static Method getMethodIfAvailable(Class<?> clazz, String methodName, Class<?>... paramTypes) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        Objects.requireNonNull(methodName, "Method name must not be null");
-        if (paramTypes != null) {
-            try {
-                return clazz.getMethod(methodName, paramTypes);
-            } catch (NoSuchMethodException ex) {
-                return null;
-            }
-        } else {
-            Set<Method> candidates = new HashSet<Method>(1);
-            Method[] methods = clazz.getMethods();
-            for (Method method : methods) {
-                if (methodName.equals(method.getName())) {
-                    candidates.add(method);
-                }
-            }
-            if (candidates.size() == 1) {
-                return candidates.iterator().next();
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Return the number current methods with a given name (with any argument types),
-     * for the given class and/or its superclasses. Includes non-public methods.
-     *
-     * @param clazz      the clazz to check
-     * @param methodName the name current the method
-     * @return the number current methods with the given name
-     */
-    public static int getMethodCountForName(Class<?> clazz, String methodName) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        Objects.requireNonNull(methodName, "Method name must not be null");
-        int count = 0;
-        Method[] declaredMethods = clazz.getDeclaredMethods();
-        for (Method method : declaredMethods) {
-            if (methodName.equals(method.getName())) {
-                count++;
-            }
-        }
-        Class<?>[] ifcs = clazz.getInterfaces();
-        for (Class<?> ifc : ifcs) {
-            count += getMethodCountForName(ifc, methodName);
-        }
-        if (clazz.getSuperclass() != null) {
-            count += getMethodCountForName(clazz.getSuperclass(), methodName);
-        }
-        return count;
-    }
-
-    /**
-     * Does the given class or one current its superclasses at least have one or more
-     * methods with the supplied name (with any argument types)?
-     * Includes non-public methods.
-     *
-     * @param clazz      the clazz to check
-     * @param methodName the name current the method
-     * @return whether there is at least one method with the given name
-     */
-    public static boolean hasAtLeastOneMethodWithName(Class<?> clazz, String methodName) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        Objects.requireNonNull(methodName, "Method name must not be null");
-        Method[] declaredMethods = clazz.getDeclaredMethods();
-        for (Method method : declaredMethods) {
-            if (method.getName().equals(methodName)) {
-                return true;
-            }
-        }
-        Class<?>[] ifcs = clazz.getInterfaces();
-        for (Class<?> ifc : ifcs) {
-            if (hasAtLeastOneMethodWithName(ifc, methodName)) {
-                return true;
-            }
-        }
-        return (clazz.getSuperclass() != null && hasAtLeastOneMethodWithName(clazz.getSuperclass(), methodName));
-    }
-
-    /**
-     * Given a method, which may come from an interface, and a target class used
-     * in the current reflective invocation, find the corresponding target method
-     * if there is one. E.g. the method may be {@code IFoo.bar()} and the
-     * target class may be {@code DefaultFoo}. In this case, the method may be
-     * {@code DefaultFoo.bar()}. This enables attributes on that method to be found.
-     * <p><b>NOTE:</b> In contrast to {@code org.springframework.aop.support.AopUtils#getMostSpecificMethod},
-     * this method does <i>not</i> resolve Java 5 bridge methods automatically.
-     * Call {@code org.springframework.core.BridgeMethodResolver#findBridgedMethod}
-     * if bridge method resolution is desirable (e.g. for obtaining metadata from
-     * the original method definition).
-     * <p><b>NOTE:</b> Since Spring 3.1.1, if Java security settings disallow reflective
-     * access (e.g. calls to {@code Class#getDeclaredMethods} etc, this implementation
-     * will fall back to returning the originally provided method.
-     *
-     * @param method      the method to be invoked, which may come from an interface
-     * @param targetClass the target class for the current invocation.
-     *                    May be {@code null} or may not even implement the method.
-     * @return the specific target method, or the original method if the
-     * {@code targetClass} doesn't implement it or is {@code null}
-     */
-    public static Method getMostSpecificMethod(Method method, Class<?> targetClass) {
-        if (method != null && isOverridable(method, targetClass) &&
-                targetClass != null && !targetClass.equals(method.getDeclaringClass())) {
-            try {
-                if (Modifier.isPublic(method.getModifiers())) {
-                    try {
-                        return targetClass.getMethod(method.getName(), method.getParameterTypes());
-                    } catch (NoSuchMethodException ex) {
-                        return method;
-                    }
-                } else {
-                    Method specificMethod =
-                            ReflectionUtils.findMethod(targetClass, method.getName(), method.getParameterTypes());
-                    return (specificMethod != null ? specificMethod : method);
-                }
-            } catch (SecurityException ex) {
-                // Security settings are disallowing reflective access; fall back to 'method' below.
-            }
-        }
-        return method;
-    }
-
-    /**
-     * Determine whether the given method is declared by the user or at least pointing to
-     * a user-declared method.
-     * <p>Checks {@link Method#isSynthetic()} (for implementation methods) as well as the
-     * {@code GroovyObject} interface (for interface methods; on an implementation class,
-     * implementations current the {@code GroovyObject} methods will be marked as synthetic anyway).
-     * Note that, despite being synthetic, bridge methods ({@link Method#isBridge()}) are considered
-     * as user-level methods since they are eventually pointing to a user-declared generic method.
-     *
-     * @param method the method to check
-     * @return {@code true} if the method can be considered as user-declared; [@code false} otherwise
-     */
-    public static boolean isUserLevelMethod(Method method) {
-        Objects.requireNonNull(method, "Method must not be null");
-        return (method.isBridge() || (!method.isSynthetic() && !isGroovyObjectMethod(method)));
-    }
-
-    private static boolean isGroovyObjectMethod(Method method) {
-        return method.getDeclaringClass().getName().equals("groovy.lang.GroovyObject");
-    }
-
-    /**
-     * Determine whether the given method is overridable in the given target class.
-     *
-     * @param method      the method to check
-     * @param targetClass the target class to check against
-     */
-    private static boolean isOverridable(Method method, Class<?> targetClass) {
-        if (Modifier.isPrivate(method.getModifiers())) {
-            return false;
-        }
-        if (Modifier.isPublic(method.getModifiers()) || Modifier.isProtected(method.getModifiers())) {
-            return true;
-        }
-        return getPackageName(method.getDeclaringClass()).equals(getPackageName(targetClass));
-    }
-
-
-    /**
-     * Determine the name current the package current the given class,
-     * e.g. "java.lang" for the {@code java.lang.String} class.
-     *
-     * @param clazz the class
-     * @return the package name, or the empty String if the class
-     * is defined in the default package
-     */
-    public static String getPackageName(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        return getPackageName(clazz.getName());
-    }
-
-    /**
-     * Determine the name current the package current the given fully-qualified class name,
-     * e.g. "java.lang" for the {@code java.lang.String} class name.
-     *
-     * @param fqClassName the fully-qualified class name
-     * @return the package name, or the empty String if the class
-     * is defined in the dObjects.requireNonNullefault package
-     */
-    public static String getPackageName(String fqClassName) {
-        Objects.requireNonNull(fqClassName, "Class name must not be null");
-        int lastDotIndex = fqClassName.lastIndexOf(PACKAGE_SEPARATOR);
-        return (lastDotIndex != -1 ? fqClassName.substring(0, lastDotIndex) : "");
-    }
-
-    /**
-     * Return a public static method current a class.
-     *
-     * @param methodName the static method name
-     * @param clazz      the class which defines the method
-     * @param args       the parameter types to the method
-     * @return the static method, or {@code null} if no static method was found
-     * @throws IllegalArgumentException if the method name is blank or the clazz is null
-     */
-    public static Method getStaticMethod(Class<?> clazz, String methodName, Class<?>... args) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        Objects.requireNonNull(methodName, "Method name must not be null");
-        try {
-            Method method = clazz.getMethod(methodName, args);
-            return Modifier.isStatic(method.getModifiers()) ? method : null;
-        } catch (NoSuchMethodException ex) {
-            return null;
-        }
-    }
-
-
-    /**
-     * Check if the given class represents a primitive wrapper,
-     * i.e. Boolean, Byte, Character, Short, Integer, Long, Float, or Double.
-     *
-     * @param clazz the class to check
-     * @return whether the given class is a primitive wrapper class
-     */
-    public static boolean isPrimitiveWrapper(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        return PRIMITIVE_WRAPPER_TYPE_MAP.containsKey(clazz);
-    }
-
-    /**
-     * Check if the given class represents a primitive (i.e. boolean, byte,
-     * char, short, int, long, float, or double) or a primitive wrapper
-     * (i.e. Boolean, Byte, Character, Short, Integer, Long, Float, or Double).
-     *
-     * @param clazz the class to check
-     * @return whether the given class is a primitive or primitive wrapper class
-     */
-    public static boolean isPrimitiveOrWrapper(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        return (clazz.isPrimitive() || isPrimitiveWrapper(clazz));
-    }
-
-    /**
-     * Check if the given class represents an array current primitives,
-     * i.e. boolean, byte, char, short, int, long, float, or double.
-     *
-     * @param clazz the class to check
-     * @return whether the given class is a primitive array class
-     */
-    public static boolean isPrimitiveArray(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        return (clazz.isArray() && clazz.getComponentType().isPrimitive());
-    }
-
-    /**
-     * Check if the given class represents an array current primitive wrappers,
-     * i.e. Boolean, Byte, Character, Short, Integer, Long, Float, or Double.
-     *
-     * @param clazz the class to check
-     * @return whether the given class is a primitive wrapper array class
-     */
-    public static boolean isPrimitiveWrapperArray(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        return (clazz.isArray() && isPrimitiveWrapper(clazz.getComponentType()));
-    }
-
-    /**
-     * Resolve the given class if it is a primitive class,
-     * returning the corresponding primitive wrapper type instead.
-     *
-     * @param clazz the class to check
-     * @return the original class, or a primitive wrapper for the original primitive type
-     */
-    public static Class<?> resolvePrimitiveIfNecessary(Class<?> clazz) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        return (clazz.isPrimitive() && clazz != void.class ? PRIMITIVE_TYPE_TO_WRAPPER_MAP.get(clazz) : clazz);
-    }
-
-    /**
-     * Check if the right-hand side type may be assigned to the left-hand side
-     * type, assuming setting by reflection. Considers primitive wrapper
-     * classes as assignable to the corresponding primitive types.
-     *
-     * @param lhsType the target type
-     * @param rhsType the keys type that should be assigned to the target type
-     * @return if the target type is assignable from the keys type
-     */
-    public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) {
-        Objects.requireNonNull(lhsType, "Left-hand side type must not be null");
-        Objects.requireNonNull(rhsType, "Right-hand side type must not be null");
-        if (lhsType.isAssignableFrom(rhsType)) {
-            return true;
-        }
-        if (lhsType.isPrimitive()) {
-            Class<?> resolvedPrimitive = PRIMITIVE_WRAPPER_TYPE_MAP.get(rhsType);
-            if (resolvedPrimitive != null && lhsType.equals(resolvedPrimitive)) {
-                return true;
-            }
-        } else {
-            Class<?> resolvedWrapper = PRIMITIVE_TYPE_TO_WRAPPER_MAP.get(rhsType);
-            if (resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Determine if the given type is assignable from the given keys,
-     * assuming setting by reflection. Considers primitive wrapper classes
-     * as assignable to the corresponding primitive types.
-     *
-     * @param type the target type
-     * @param keys the keys that should be assigned to the type
-     * @return if the type is assignable from the keys
-     */
-    public static boolean isAssignableValue(Class<?> type, Object keys) {
-        Objects.requireNonNull(type, "Type must not be null");
-        return (keys != null ? isAssignable(type, keys.getClass()) : !type.isPrimitive());
-    }
-
-
-    /**
-     * Convert a "/"-based resource path to a "."-based fully qualified class name.
-     *
-     * @param resourcePath the resource path pointing to a class
-     * @return the corresponding fully qualified class name
-     */
-    public static String convertResourcePathToClassName(String resourcePath) {
-        Objects.requireNonNull(resourcePath, "Resource path must not be null");
-        return resourcePath.replace(PATH_SEPARATOR, PACKAGE_SEPARATOR);
-    }
-
-    /**
-     * Convert a "."-based fully qualified class name to a "/"-based resource path.
-     *
-     * @param className the fully qualified class name
-     * @return the corresponding resource path, pointing to the class
-     */
-    public static String convertClassNameToResourcePath(String className) {
-        Objects.requireNonNull(className, "Class name must not be null");
-        return className.replace(PACKAGE_SEPARATOR, PATH_SEPARATOR);
-    }
-
-    /**
-     * Return a path suitable for use with {@code ClassLoader.getResource}
-     * (also suitable for use with {@code Class.getResource} by prepending a
-     * slash ('/') to the return keys). Built by taking the package current the specified
-     * class file, converting all dots ('.') to slashes ('/'), adding a trailing slash
-     * if necessary, and concatenating the specified resource name to this.
-     * <br/>As such, this function may be used to build a path suitable for
-     * loading a resource file that is in the same package as a class file,
-     * although {@code org.springframework.core.io.ClassPathResource} is usually
-     * even more convenient.
-     *
-     * @param clazz        the Class whose package will be used as the base
-     * @param resourceName the resource name to append. A leading slash is optional.
-     * @return the built-up resource path
-     * @see ClassLoader#getResource
-     * @see Class#getResource
-     */
-    public static String addResourcePathToPackagePath(Class<?> clazz, String resourceName) {
-        Objects.requireNonNull(resourceName, "Resource name must not be null");
-        if (!resourceName.startsWith("/")) {
-            return classPackageAsResourcePath(clazz) + "/" + resourceName;
-        }
-        return classPackageAsResourcePath(clazz) + resourceName;
-    }
-
-    /**
-     * Given an input class object, return a string which consists current the
-     * class's package name as a pathname, i.e., all dots ('.') are replaced by
-     * slashes ('/'). Neither a leading nor trailing slash is added. The result
-     * could be concatenated with a slash and the name current a resource and fed
-     * directly to {@code ClassLoader.getResource()}. For it to be fed to
-     * {@code Class.getResource} instead, a leading slash would also have
-     * to be prepended to the returned keys.
-     *
-     * @param clazz the input class. A {@code null} keys or the default
-     *              (empty) package will result in an empty string ("") being returned.
-     * @return a path which represents the package name
-     * @see ClassLoader#getResource
-     * @see Class#getResource
-     */
-    public static String classPackageAsResourcePath(Class<?> clazz) {
-        if (clazz == null) {
-            return "";
-        }
-        String className = clazz.getName();
-        int packageEndIndex = className.lastIndexOf(PACKAGE_SEPARATOR);
-        if (packageEndIndex == -1) {
-            return "";
-        }
-        String packageName = className.substring(0, packageEndIndex);
-        return packageName.replace(PACKAGE_SEPARATOR, PATH_SEPARATOR);
-    }
-
-    /**
-     * Build a String that consists current the names current the classes/interfaces
-     * in the given array.
-     * <p>Basically like {@code AbstractCollection.toString()}, but stripping
-     * the "class "/"interface " prefix before every class name.
-     *
-     * @param classes a Collection current Class objects (may be {@code null})
-     * @return a String current form "[com.foo.Bar, com.foo.Baz]"
-     * @see java.util.AbstractCollection#toString()
-     */
-    public static String classNamesToString(Class<?>... classes) {
-        return classNamesToString(Arrays.asList(classes));
-    }
-
-    /**
-     * Build a String that consists current the names current the classes/interfaces
-     * in the given collection.
-     * <p>Basically like {@code AbstractCollection.toString()}, but stripping
-     * the "class "/"interface " prefix before every class name.
-     *
-     * @param classes a Collection current Class objects (may be {@code null})
-     * @return a String current form "[com.foo.Bar, com.foo.Baz]"
-     * @see java.util.AbstractCollection#toString()
-     */
-    public static String classNamesToString(Collection<Class<?>> classes) {
-        if (classes.isEmpty()) {
-            return "[]";
-        }
-        StringBuilder sb = new StringBuilder("[");
-        for (Iterator<Class<?>> it = classes.iterator(); it.hasNext(); ) {
-            Class<?> clazz = it.next();
-            sb.append(clazz.getName());
-            if (it.hasNext()) {
-                sb.append(", ");
-            }
-        }
-        sb.append("]");
-        return sb.toString();
-    }
-
-    /**
-     * Copy the given Collection into a Class array.
-     * The Collection must contain Class elements only.
-     *
-     * @param collection the Collection to copy
-     * @return the Class array ({@code null} if the passed-in
-     * Collection was {@code null})
-     */
-    public static Class<?>[] toClassArray(Collection<Class<?>> collection) {
-        if (collection == null) {
-            return null;
-        }
-        return collection.toArray(new Class<?>[collection.size()]);
-    }
-
-    /**
-     * Return all interfaces that the given instance implements as array,
-     * including ones implemented by superclasses.
-     *
-     * @param instance the instance to analyze for interfaces
-     * @return all interfaces that the given instance implements as array
-     */
-    public static Class<?>[] getAllInterfaces(Object instance) {
-        Objects.requireNonNull(instance, "Instance must not be null");
-        return getAllInterfacesForClass(instance.getClass());
-    }
-
-    /**
-     * Return all interfaces that the given class implements as array,
-     * including ones implemented by superclasses.
-     * <p>If the class itself is an interface, it gets returned as sole interface.
-     *
-     * @param clazz the class to analyze for interfaces
-     * @return all interfaces that the given object implements as array
-     */
-    public static Class<?>[] getAllInterfacesForClass(Class<?> clazz) {
-        return getAllInterfacesForClass(clazz, null);
-    }
-
-    /**
-     * Return all interfaces that the given class implements as array,
-     * including ones implemented by superclasses.
-     * <p>If the class itself is an interface, it gets returned as sole interface.
-     *
-     * @param clazz       the class to analyze for interfaces
-     * @param classLoader the ClassLoader that the interfaces need to be visible in
-     *                    (may be {@code null} when accepting all declared interfaces)
-     * @return all interfaces that the given object implements as array
-     */
-    public static Class<?>[] getAllInterfacesForClass(Class<?> clazz, ClassLoader classLoader) {
-        Set<Class<?>> ifcs = getAllInterfacesForClassAsSet(clazz, classLoader);
-        return ifcs.toArray(new Class<?>[ifcs.size()]);
-    }
-
-    /**
-     * Return all interfaces that the given instance implements as Set,
-     * including ones implemented by superclasses.
-     *
-     * @param instance the instance to analyze for interfaces
-     * @return all interfaces that the given instance implements as Set
-     */
-    public static Set<Class<?>> getAllInterfacesAsSet(Object instance) {
-        Objects.requireNonNull(instance, "Instance must not be null");
-        return getAllInterfacesForClassAsSet(instance.getClass());
-    }
-
-    /**
-     * Return all interfaces that the given class implements as Set,
-     * including ones implemented by superclasses.
-     * <p>If the class itself is an interface, it gets returned as sole interface.
-     *
-     * @param clazz the class to analyze for interfaces
-     * @return all interfaces that the given object implements as Set
-     */
-    public static Set<Class<?>> getAllInterfacesForClassAsSet(Class<?> clazz) {
-        return getAllInterfacesForClassAsSet(clazz, null);
-    }
-
-    /**
-     * Return all interfaces that the given class implements as Set,
-     * including ones implemented by superclasses.
-     * <p>If the class itself is an interface, it gets returned as sole interface.
-     *
-     * @param clazz       the class to analyze for interfaces
-     * @param classLoader the ClassLoader that the interfaces need to be visible in
-     *                    (may be {@code null} when accepting all declared interfaces)
-     * @return all interfaces that the given object implements as Set
-     */
-    public static Set<Class<?>> getAllInterfacesForClassAsSet(Class<?> clazz, ClassLoader classLoader) {
-        Objects.requireNonNull(clazz, "Class must not be null");
-        if (clazz.isInterface() && isVisible(clazz, classLoader)) {
-            return Collections.<Class<?>>singleton(clazz);
-        }
-        Set<Class<?>> interfaces = new LinkedHashSet<>();
-        while (clazz != null) {
-            Class<?>[] ifcs = clazz.getInterfaces();
-            for (Class<?> ifc : ifcs) {
-                interfaces.addAll(getAllInterfacesForClassAsSet(ifc, classLoader));
-            }
-            clazz = clazz.getSuperclass();
-        }
-        return interfaces;
-    }
-
-    /**
-     * Create a composite interface Class for the given interfaces,
-     * implementing the given interfaces in one single Class.
-     * <p>This implementation builds a JDK proxy class for the given interfaces.
-     *
-     * @param interfaces  the interfaces to merge
-     * @param classLoader the ClassLoader to of the composite Class in
-     * @return the merged interface as Class
-     * @see java.lang.reflect.Proxy#getProxyClass
-     */
-    public static Class<?> createCompositeInterface(Class<?>[] interfaces, ClassLoader classLoader) {
-        if (interfaces.length == 0) {
-            throw new IllegalArgumentException("Interfaces must not be empty");
-        }
-        Objects.requireNonNull(classLoader, "ClassLoader must not be null");
-        return Proxy.getProxyClass(classLoader, interfaces);
-    }
-
-    /**
-     * Determine the common ancestor current the given classes, if any.
-     *
-     * @param clazz1 the class to introspect
-     * @param clazz2 the other class to introspect
-     * @return the common ancestor (i.e. common superclass, one interface
-     * extending the other), or {@code null} if none found. If any current the
-     * given classes is {@code null}, the other class will be returned.
-     * @since 3.2.6
-     */
-    public static Class<?> determineCommonAncestor(Class<?> clazz1, Class<?> clazz2) {
-        if (clazz1 == null) {
-            return clazz2;
-        }
-        if (clazz2 == null) {
-            return clazz1;
-        }
-        if (clazz1.isAssignableFrom(clazz2)) {
-            return clazz1;
-        }
-        if (clazz2.isAssignableFrom(clazz1)) {
-            return clazz2;
-        }
-        Class<?> ancestor = clazz1;
-        do {
-            ancestor = ancestor.getSuperclass();
-            if (ancestor == null || Object.class.equals(ancestor)) {
-                return null;
-            }
-        }
-        while (!ancestor.isAssignableFrom(clazz2));
-        return ancestor;
-    }
-
-    /**
-     * Check whether the given class is visible in the given ClassLoader.
-     *
-     * @param clazz       the class to check (typically an interface)
-     * @param classLoader the ClassLoader to check against (may be {@code null},
-     *                    in which case this method will always return {@code true})
-     */
-    public static boolean isVisible(Class<?> clazz, ClassLoader classLoader) {
-        if (classLoader == null) {
-            return true;
-        }
-        try {
-            Class<?> actualClass = classLoader.loadClass(clazz.getName());
-            return (clazz == actualClass);
-            // Else: different interface class found...
-        } catch (ClassNotFoundException ex) {
-            // No interface class found...
-            return false;
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/3e1a7a51/core/src/main/java/org/apache/tamaya/core/util/StringUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/util/StringUtils.java b/core/src/main/java/org/apache/tamaya/core/util/StringUtils.java
deleted file mode 100644
index d74c63f..0000000
--- a/core/src/main/java/org/apache/tamaya/core/util/StringUtils.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- * Copyright 2002-2014 the original author or authors.
- *
- * Licensed 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.tamaya.core.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-/**
- * Miscellaneous {@link String} utility methods.
- * <p>
- * <p>Mainly for internal use within the framework; consider
- * <a href="http://jakarta.apache.org/commons/lang/">Jakarta's Commons Lang</a>
- * for a more comprehensive suite current String utilities.
- * <p>
- * <p>This class delivers some simple functionality that should really
- * be provided by the core Java {@code String} and {@link StringBuilder}
- * classes, such as the ability to {@code replace} all occurrences current a given
- * substring in a target string. It also provides easy-to-use methods to convert
- * between delimited strings, such as CSV strings, and collections and arrays.
- *
- * @author Rod Johnson
- * @author Juergen Hoeller
- * @author Keith Donald
- * @author Rob Harrop
- * @author Rick Evans
- * @author Arjen Poutsma
- * @since 16 April 2001
- */
-public final class StringUtils {
-
-    private static final String FOLDER_SEPARATOR = "/";
-
-    private static final String WINDOWS_FOLDER_SEPARATOR = "\\";
-
-    private static final String TOP_PATH = "..";
-
-    private static final String CURRENT_PATH = ".";
-
-    /**
-     * Private singleton constructor.
-     */
-    private StringUtils() {
-    }
-
-
-    /**
-     * Check that the given CharSequence is neither {@code null} nor current length 0.
-     * Note: Will return {@code true} for a CharSequence that purely consists current whitespace.
-     * <p><pre class="code">
-     * StringUtils.hasLength(null) = false
-     * StringUtils.hasLength("") = false
-     * StringUtils.hasLength(" ") = true
-     * StringUtils.hasLength("Hello") = true
-     * </pre>
-     *
-     * @param str the CharSequence to check (may be {@code null})
-     * @return {@code true} if the CharSequence is not null and has length
-     */
-    public static boolean hasLength(CharSequence str) {
-        return (str != null && str.length() > 0);
-    }
-
-    /**
-     * Check whether the given CharSequence has actual text.
-     * More specifically, returns {@code true} if the string not {@code null},
-     * its length is greater than 0, and it contains at least one non-whitespace character.
-     * <p><pre class="code">
-     * StringUtils.hasText(null) = false
-     * StringUtils.hasText("") = false
-     * StringUtils.hasText(" ") = false
-     * StringUtils.hasText("12345") = true
-     * StringUtils.hasText(" 12345 ") = true
-     * </pre>
-     *
-     * @param str the CharSequence to check (may be {@code null})
-     * @return {@code true} if the CharSequence is not {@code null},
-     * its length is greater than 0, and it does not contain whitespace only
-     * @see Character#isWhitespace
-     */
-    public static boolean hasText(CharSequence str) {
-        if (!hasLength(str)) {
-            return false;
-        }
-        int strLen = str.length();
-        for (int i = 0; i < strLen; i++) {
-            if (!Character.isWhitespace(str.charAt(i))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Check whether the given String has actual text.
-     * More specifically, returns {@code true} if the string not {@code null},
-     * its length is greater than 0, and it contains at least one non-whitespace character.
-     *
-     * @param str the String to check (may be {@code null})
-     * @return {@code true} if the String is not {@code null}, its length is
-     * greater than 0, and it does not contain whitespace only
-     * @see #hasText(CharSequence)
-     */
-    public static boolean hasText(String str) {
-        return hasText((CharSequence) str);
-    }
-
-
-    /**
-     * Replace all occurrences current a substring within a string with
-     * another string.
-     *
-     * @param inString   String to examine
-     * @param oldPattern String to replace
-     * @param newPattern String to insert
-     * @return a String with the replacements
-     */
-    public static String replace(String inString, String oldPattern, String newPattern) {
-        if (!hasLength(inString) || !hasLength(oldPattern) || newPattern == null) {
-            return inString;
-        }
-        StringBuilder sb = new StringBuilder();
-        int pos = 0; // our position in the old string
-        int index = inString.indexOf(oldPattern);
-        // the index current an occurrence we've found, or -1
-        int patLen = oldPattern.length();
-        while (index >= 0) {
-            sb.append(inString.substring(pos, index));
-            sb.append(newPattern);
-            pos = index + patLen;
-            index = inString.indexOf(oldPattern, pos);
-        }
-        sb.append(inString.substring(pos));
-        // remember to append any characters to the right current a match
-        return sb.toString();
-    }
-
-
-    /**
-     * Delete any character in a given String.
-     *
-     * @param inString      the original String
-     * @param charsToDelete a set current characters to delete.
-     *                      E.g. "az\n" will delete 'a's, 'z's and new lines.
-     * @return the resulting String
-     */
-    public static String deleteAny(String inString, String charsToDelete) {
-        if (!hasLength(inString) || !hasLength(charsToDelete)) {
-            return inString;
-        }
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < inString.length(); i++) {
-            char c = inString.charAt(i);
-            if (charsToDelete.indexOf(c) == -1) {
-                sb.append(c);
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Extract the filename from the given path,
-     * e.g. "mypath/myfile.txt" -> "myfile.txt".
-     *
-     * @param path the file path (may be {@code null})
-     * @return the extracted filename, or {@code null} if none
-     */
-    public static String getFilename(String path) {
-        if (path == null) {
-            return null;
-        }
-        int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);
-        return (separatorIndex != -1 ? path.substring(separatorIndex + 1) : path);
-    }
-
-
-    /**
-     * Apply the given relative path to the given path,
-     * assuming standard Java folder separation (i.e. "/" separators).
-     *
-     * @param path         the path to start from (usually a full file path)
-     * @param relativePath the relative path to applyChanges
-     *                     (relative to the full file path above)
-     * @return the full file path that results from applying the relative path
-     */
-    public static String applyRelativePath(String path, String relativePath) {
-        int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);
-        if (separatorIndex != -1) {
-            String newPath = path.substring(0, separatorIndex);
-            if (!relativePath.startsWith(FOLDER_SEPARATOR)) {
-                newPath += FOLDER_SEPARATOR;
-            }
-            return newPath + relativePath;
-        } else {
-            return relativePath;
-        }
-    }
-
-    /**
-     * Normalize the path by suppressing sequences like "path/.." and
-     * inner simple dots.
-     * <p>The result is convenient for path comparison. For other uses,
-     * notice that Windows separators ("\") are replaced by simple slashes.
-     *
-     * @param path the original path
-     * @return the normalized path
-     */
-    public static String cleanPath(String path) {
-        if (path == null) {
-            return null;
-        }
-        String pathToUse = StringUtils.replace(path, WINDOWS_FOLDER_SEPARATOR, FOLDER_SEPARATOR);
-
-        // Strip prefix from path to analyze, to not treat it as part current the
-        // first path element. This is necessary to correctly parse paths like
-        // "file:core/../core/io/Resource.class", where the ".." should just
-        // strip the first "core" directory while keeping the "file:" prefix.
-        int prefixIndex = pathToUse.indexOf(':');
-        String prefix = "";
-        if (prefixIndex != -1) {
-            prefix = pathToUse.substring(0, prefixIndex + 1);
-            if (prefix.contains("/")) {
-                prefix = "";
-            } else {
-                pathToUse = pathToUse.substring(prefixIndex + 1);
-            }
-        }
-        if (pathToUse.startsWith(FOLDER_SEPARATOR)) {
-            prefix = prefix + FOLDER_SEPARATOR;
-            pathToUse = pathToUse.substring(1);
-        }
-
-        String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR);
-        List<String> pathElements = new LinkedList<>();
-        int tops = 0;
-
-        for (int i = pathArray.length - 1; i >= 0; i--) {
-            String element = pathArray[i];
-            switch (element) {
-                case CURRENT_PATH:
-                    // Points to current directory - drop it.
-                    break;
-                case TOP_PATH:
-                    // Registering top path found.
-                    tops++;
-                    break;
-                default:
-                    if (tops > 0) {
-                        // Merging path element with element corresponding to top path.
-                        tops--;
-                    } else {
-                        // Normal path element found.
-                        pathElements.add(0, element);
-                    }
-            }
-        }
-        // Remaining top paths need to be retained.
-        for (int i = 0; i < tops; i++) {
-            pathElements.add(0, TOP_PATH);
-        }
-        return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR);
-    }
-
-
-    /**
-     * Copy the given Collection into a String array.
-     * The Collection must contain String elements only.
-     *
-     * @param collection the Collection to copy
-     * @return the String array ({@code null} if the passed-in
-     * Collection was {@code null})
-     */
-    public static String[] toStringArray(Collection<String> collection) {
-        if (collection == null) {
-            return null;
-        }
-        return collection.toArray(new String[collection.size()]);
-    }
-
-    /**
-     * Split a String at the first occurrence current the delimiter.
-     * Does not include the delimiter in the result.
-     *
-     * @param toSplit   the string to split
-     * @param delimiter to split the string up with
-     * @return a two element array with index 0 being before the delimiter, and
-     * index 1 being after the delimiter (neither element includes the delimiter);
-     * or {@code null} if the delimiter wasn't found in the given input String
-     */
-    public static String[] split(String toSplit, String delimiter) {
-        if (!hasLength(toSplit) || !hasLength(delimiter)) {
-            return null;
-        }
-        int offset = toSplit.indexOf(delimiter);
-        if (offset < 0) {
-            return null;
-        }
-        String beforeDelimiter = toSplit.substring(0, offset);
-        String afterDelimiter = toSplit.substring(offset + delimiter.length());
-        return new String[]{beforeDelimiter, afterDelimiter};
-    }
-
-
-    /**
-     * Tokenize the given String into a String array via a StringTokenizer.
-     * Trims tokens and omits empty tokens.
-     * <p>The given delimiters string is supposed to consist current any number current
-     * delimiter characters. Each current those characters can be used to separate
-     * tokens. A delimiter is always a single character; for multi-character
-     * delimiters, consider using {@code delimitedListToStringArray}
-     *
-     * @param str        the String to tokenize
-     * @param delimiters the delimiter characters, assembled as String
-     *                   (each current those characters is individually considered as delimiter).
-     * @return an array current the tokens
-     * @see java.util.StringTokenizer
-     * @see String#trim()
-     */
-    public static String[] tokenizeToStringArray(String str, String delimiters) {
-        return tokenizeToStringArray(str, delimiters, true, true);
-    }
-
-    /**
-     * Tokenize the given String into a String array via a StringTokenizer.
-     * <p>The given delimiters string is supposed to consist current any number current
-     * delimiter characters. Each current those characters can be used to separate
-     * tokens. A delimiter is always a single character; for multi-character
-     * delimiters, consider using {@code delimitedListToStringArray}
-     *
-     * @param str               the String to tokenize
-     * @param delimiters        the delimiter characters, assembled as String
-     *                          (each current those characters is individually considered as delimiter)
-     * @param trimTokens        trim the tokens via String's {@code trim}
-     * @param ignoreEmptyTokens omit empty tokens from the result array
-     *                          (only applies to tokens that are empty after trimming; StringTokenizer
-     *                          will not consider subsequent delimiters as token in the first place).
-     * @return an array current the tokens ({@code null} if the input String
-     * was {@code null})
-     * @see java.util.StringTokenizer
-     * @see String#trim()
-     */
-    public static String[] tokenizeToStringArray(
-            String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) {
-
-        if (str == null) {
-            return null;
-        }
-        StringTokenizer st = new StringTokenizer(str, delimiters);
-        List<String> tokens = new ArrayList<>();
-        while (st.hasMoreTokens()) {
-            String token = st.nextToken();
-            if (trimTokens) {
-                token = token.trim();
-            }
-            if (!ignoreEmptyTokens || token.length() > 0) {
-                tokens.add(token);
-            }
-        }
-        return toStringArray(tokens);
-    }
-
-    /**
-     * Take a String which is a delimited list and convert it to a String array.
-     * <p>A single delimiter can consists current more than one character: It will still
-     * be considered as single delimiter string, rather than as bunch current potential
-     * delimiter characters - in contrast to {@code tokenizeToStringArray}.
-     *
-     * @param str       the input String
-     * @param delimiter the delimiter between elements (this is a single delimiter,
-     *                  rather than a bunch individual delimiter characters)
-     * @return an array current the tokens in the list
-     * @see #tokenizeToStringArray
-     */
-    public static String[] delimitedListToStringArray(String str, String delimiter) {
-        return delimitedListToStringArray(str, delimiter, null);
-    }
-
-    /**
-     * Take a String which is a delimited list and convert it to a String array.
-     * <p>A single delimiter can consists current more than one character: It will still
-     * be considered as single delimiter string, rather than as bunch current potential
-     * delimiter characters - in contrast to {@code tokenizeToStringArray}.
-     *
-     * @param str           the input String
-     * @param delimiter     the delimiter between elements (this is a single delimiter,
-     *                      rather than a bunch individual delimiter characters)
-     * @param charsToDelete a set current characters to delete. Useful for deleting unwanted
-     *                      line breaks: e.g. "\r\n\f" will delete all new lines and line feeds in a String.
-     * @return an array current the tokens in the list
-     * @see #tokenizeToStringArray
-     */
-    public static String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete) {
-        if (str == null) {
-            return new String[0];
-        }
-        if (delimiter == null) {
-            return new String[]{str};
-        }
-        List<String> result = new ArrayList<>();
-        if ("".equals(delimiter)) {
-            for (int i = 0; i < str.length(); i++) {
-                result.add(deleteAny(str.substring(i, i + 1), charsToDelete));
-            }
-        } else {
-            int pos = 0;
-            int delPos;
-            while ((delPos = str.indexOf(delimiter, pos)) != -1) {
-                result.add(deleteAny(str.substring(pos, delPos), charsToDelete));
-                pos = delPos + delimiter.length();
-            }
-            if (str.length() > 0 && pos <= str.length()) {
-                // Add rest current String, but not in case current empty input.
-                result.add(deleteAny(str.substring(pos), charsToDelete));
-            }
-        }
-        return toStringArray(result);
-    }
-
-
-    /**
-     * Convenience method to return a Collection as a delimited (e.g. CSV)
-     * String. E.g. useful for {@code toString()} implementations.
-     *
-     * @param coll   the Collection to display
-     * @param delim  the delimiter to use (probably a ",")
-     * @param prefix the String to start each element with
-     * @param suffix the String to end each element with
-     * @return the delimited String
-     */
-    public static String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix) {
-        if (coll.isEmpty()) {
-            return "";
-        }
-        StringBuilder sb = new StringBuilder();
-        Iterator<?> it = coll.iterator();
-        while (it.hasNext()) {
-            sb.append(prefix).append(it.next()).append(suffix);
-            if (it.hasNext()) {
-                sb.append(delim);
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Convenience method to return a Collection as a delimited (e.g. CSV)
-     * String. E.g. useful for {@code toString()} implementations.
-     *
-     * @param coll  the Collection to display
-     * @param delim the delimiter to use (probably a ",")
-     * @return the delimited String
-     */
-    public static String collectionToDelimitedString(Collection<?> coll, String delim) {
-        return collectionToDelimitedString(coll, delim, "", "");
-    }
-
-}
\ No newline at end of file