ch.qos.logback.classic.gaffer.PropertyUtil.groovy Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of logback-groovy-config Show documentation
Show all versions of logback-groovy-config Show documentation
This library provides the Groovy DSL for configuration Log back and adds some security to the DSL
The 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()})
}
}