1
package com.eucalyptus.util;
3
import org.apache.log4j.Logger;
5
public class CompositeHelper<T> {
6
private static Logger LOG = Logger.getLogger( CompositeHelper.class );
7
private Class<T> destType;
8
List<Class> sourceTypes;
10
public CompositeHelper( Class<T> destType, List<Class> sources ) {
11
this.destType = destType;
12
this.sourceTypes = sources;
13
destType.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class" }.each{
16
def check=vars.clone()
18
src.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class" }.each { f ->
22
check.each{ k,v -> LOG.debug( "WARNING: the field ${destType.class.name}.${k} will not be set since it is not defined in any of ${args}" ); }
25
public T compose( T dest, Object... args ) {
26
def props = vars.clone();
28
src.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class" }.each {
29
if( props.containsKey( it.name ) ) {
30
LOG.debug("${src.class.simpleName}.${it.name} as ${dest.class.simpleName}.${it.name}=${src[it.name]}");
31
dest[it.name]=src[it.name];
32
props.remove(it.name);
34
LOG.trace("WARNING: Ignoring ${src.class.name}.${it.name} as it is not in the destination type.");
38
dest.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class" }.each { LOG.debug("${dest.class.simpleName}.${it.name} = ${dest[it.name]}"); }
42
public List<Object> project( T source, Object... args ) {
44
def props = dest.metaClass.properties.collect{ p -> p.name };
45
source.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class"&&props.contains(it.name)&&source[it.name]!=null }.each { sourceField ->
46
LOG.debug("${source.class.simpleName}.${sourceField.name} as ${dest.class.simpleName}.${sourceField.name}=${source[sourceField.name]}");
47
dest[sourceField.name]=source[sourceField.name];
50
return Arrays.asList(args);
53
public static Object update( Object source, Object dest ) {
54
def props = dest.metaClass.properties.collect{ p -> p.name };
55
source.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class"&&props.contains(it.name)&&source[it.name]!=null }.each{ sourceField ->
56
LOG.debug("${source.class.simpleName}.${sourceField.name} as ${dest.class.simpleName}.${sourceField.name}=${source[sourceField.name]}");
57
dest[sourceField.name]=source[sourceField.name];
62
public static Object updateNulls( Object source, Object dest ) {
63
def props = dest.metaClass.properties.collect{ p -> p.name };
64
source.metaClass.properties.findAll{ it.name!="metaClass"&&it.name!="class"&&props.contains(it.name) }.each{ sourceField ->
65
LOG.debug("${source.class.simpleName}.${sourceField.name} as ${dest.class.simpleName}.${sourceField.name}=${source[sourceField.name]}");
66
dest[sourceField.name]=source[sourceField.name];