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

ch.qos.logback.classic.gaffer.PropertyUtil.groovy Maven / Gradle / Ivy

Go to download

This library provides the Groovy DSL for configuration Log back and adds some security to the DSL

There is a newer version: 1.14.5
Show newest version
/**
 * Logback: the reliable, generic, fast and flexible logging framework.
 * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are dual-licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation
 *
 *   or (per the licensee's choosing)
 *
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 */
package ch.qos.logback.classic.gaffer

import ch.qos.logback.core.joran.util.StringToObjectConverter
import ch.qos.logback.core.joran.util.beans.BeanUtil

import java.lang.reflect.Method

/**
 * @author Ceki Gücü
 */
class PropertyUtil {

    static boolean hasAdderMethod(Object obj, String name) {
        String addMethod = "add${upperCaseFirstLetter(name)}"
        return obj.metaClass.respondsTo(obj, addMethod)
    }


    static NestingType nestingType(Object obj, String name, Object value) {
        def decapitalizedName = BeanUtil.toLowerCamelCase(name)
        MetaProperty metaProperty = obj.hasProperty(decapitalizedName)

        if(metaProperty != null) {
            boolean VALUE_IS_A_STRING = value instanceof String
            
            if(VALUE_IS_A_STRING && StringToObjectConverter.followsTheValueOfConvention(metaProperty.getType())) {
                return NestingType.SINGLE_WITH_VALUE_OF_CONVENTION
            } else {
                return NestingType.SINGLE
            }
        }

        if (hasAdderMethod(obj, name)) {
            return NestingType.AS_COLLECTION
        }

        return NestingType.NA
    }

    static Object convertByValueMethod(Object component, String name, String value) {
        def decapitalizedName = BeanUtil.toLowerCamelCase(name)
        MetaProperty metaProperty = component.hasProperty(decapitalizedName)
        Method valueOfMethod = StringToObjectConverter.getValueOfMethod(metaProperty.getType())
        return valueOfMethod.invoke(null, value)
    }
    
    static void attach(NestingType nestingType, Object component, Object subComponent, String name) {
        switch (nestingType) {
            case NestingType.SINGLE_WITH_VALUE_OF_CONVENTION:
                name = BeanUtil.toLowerCamelCase(name)
                Object value = convertByValueMethod(component, name, subComponent)
                component."${name}" = value
                break
            case NestingType.SINGLE:
                name = BeanUtil.toLowerCamelCase(name)
                component."${name}" = subComponent
                break

            case NestingType.AS_COLLECTION:
                String firstUpperName = PropertyUtil.upperCaseFirstLetter(name)
                component."add${firstUpperName}"(subComponent)
                break
        }
    }

    static String transformFirstLetter(String s, Closure closure) {
        if (s == null || s.length() == 0)
            return s

        String firstLetter = new String(s.getAt(0))

        String modifiedFistLetter = closure(firstLetter)

        if (s.length() == 1)
            return modifiedFistLetter
        else
            return modifiedFistLetter + s.substring(1)
    }

    static String upperCaseFirstLetter(String s) {
        return transformFirstLetter(s, {String it -> it.toUpperCase()})
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy