// Path: src/main/java/com/exmertec/dummie/cache/Constant.java
// public class Constant {
//     public static final String DEFAULT_STRING_VALUE = "DEFAULT.STRING-value";
// }
// 
// Path: src/main/java/com/exmertec/dummie/generator/data/DataGenerator.java
// public abstract class DataGenerator {
// 
//     private final List<FieldValueGenerator> generators;
// 
//     private final Set<String> randomFieldKeys;
// 
//     private final Set<Class<?>> randomFieldType;
// 
//     protected DataCache dataCache;
// 
//     protected GenerationStrategy strategy;
// 
//     public DataGenerator(GenerationStrategy strategy) {
//         this(strategy, new KeyValueDataCache());
//     }
// 
//     public DataGenerator(GenerationStrategy strategy, DataCache dataCache) {
//         this.dataCache = dataCache;
//         this.strategy = strategy;
// 
//         generators = new ArrayList<FieldValueGenerator>();
//         randomFieldKeys = new HashSet<String>();
//         randomFieldType = new HashSet<Class<?>>();
// 
//         addDefaultGenerators();
//     }
// 
//     private void addDefaultGenerators() {
//         generators.add(new StringFieldValueGenerator());
//         generators.add(new ListFieldValueGenerator());
//         generators.add(new MapFieldValueGenerator());
//         generators.add(new SetFieldValueGenerator());
//         generators.add(new BooleanFieldValueGenerator());
//         generators.add(new ByteFieldValueGenerator());
//         generators.add(new CharacterFieldValueGenerator());
//         generators.add(new DoubleFieldValueGenerator());
//         generators.add(new FloatFieldValueGenerator());
//         generators.add(new IntegerFieldValueGenerator());
//         generators.add(new LongFieldValueGenerator());
//         generators.add(new ShortFieldValueGenerator());
//         generators.add(new EnumFieldValueGenerator());
//         generators.add(new BigDecimalFieldValueGenerator());
//     }
// 
//     public Object getData(Field field) {
//         Class<?> fieldType = field.getType();
//         Object value = dataCache.getCachedData(fieldType, field.getName());
//         if (value == null) {
//             FieldValueGenerator generator = getGenerator(fieldType, field.getName());
//             if (generator != null) {
//                 value = generator.generate(this, field);
//             }
//         }
//         return value;
//     }
// 
//     public Object getData(Class<?> dataType, String key) {
//         Object value = dataCache.getCachedData(dataType, key);
//         if (value == null) {
//             FieldValueGenerator generator = getGenerator(dataType, key);
//             if (generator != null) {
//                 value = generator.generate(this, dataType, key);
//             }
//         }
//         return value;
//     }
// 
//     public <T> void cacheData(Class<T> dataType, String key, Object value) {
//         dataCache.cacheData(dataType, key, value);
//     }
// 
//     public <T> void cacheData(Class<T> clazz, Object value) {
//         dataCache.cacheData(clazz, value);
//     }
// 
//     public  <T> void dynamicCacheData(Class<T> dataType, String key, Object value) {
//         if (getStrategy(dataType, key) == GenerationStrategy.DEFAULT) {
//             dataCache.cacheData(dataType, key, value);
//         }
//     }
// 
//     public void random(Class<?> clazz) {
//         randomFieldType.add(clazz);
//     }
// 
//     public void random(String key) {
//         randomFieldKeys.add(key);
//     }
// 
//     protected GenerationStrategy getStrategy(Class<?> dataType, String key) {
//         return randomFieldType.contains(dataType) || randomFieldKeys.contains(key) ?
//             GenerationStrategy.RANDOM : strategy;
//     }
// 
//     protected FieldValueGenerator switchGeneratorStrategy(FieldValueGenerator generator,
//                                                           Class<?> dataType, String key) {
//         generator.setStrategy(getStrategy(dataType, key));
//         return generator;
//     }
// 
//     private FieldValueGenerator getGenerator(Class<?> dataType, String key) {
//         return switchGeneratorStrategy(getCachedGenerator(dataType), dataType, key);
//     }
// 
//     private FieldValueGenerator getCachedGenerator(Class<?> dataType) {
//         for (FieldValueGenerator generator: generators) {
//             if (generator.isMatchType(dataType)) {
//                 return generator;
//             }
//         }
// 
//         return getDefaultFieldValueGenerator(dataType);
//     }
// 
//     protected abstract FieldValueGenerator getDefaultFieldValueGenerator(Class<?> dataType);
// }
// 
// Path: src/main/java/com/exmertec/dummie/configuration/GenerationStrategy.java
// public enum GenerationStrategy {
//     DEFAULT, RANDOM
// }


import com.exmertec.dummie.cache.Constant;
import com.exmertec.dummie.generator.data.DataGenerator;
import com.exmertec.dummie.configuration.GenerationStrategy;
import java.lang.reflect.Field;
import java.util.UUID;
package com.exmertec.dummie.generator.field;



public abstract class FieldValueGenerator {
    private final Class<?>[] fieldTypes;
    protected GenerationStrategy strategy;

    protected FieldValueGenerator(Class<?>... fieldTypes) {
        this(GenerationStrategy.DEFAULT, fieldTypes);
    }

    protected FieldValueGenerator(GenerationStrategy strategy, Class<?>... fieldTypes) {
        this.strategy = strategy;
        this.fieldTypes = fieldTypes;
    }

    public Object generate(DataGenerator dataGenerator, Field field) {
        return generate(dataGenerator, field.getType(), field.getName());
    }

    public Object generate(DataGenerator dataGenerator, Class<?> fieldType, String fieldName) {
        switch (strategy) {
            case RANDOM:
                return randomGenerator(dataGenerator, fieldType, fieldName);
            case DEFAULT:
            default:
                return defaultGenerator(dataGenerator, fieldType, fieldName);
        }
    }

    protected String generateKeyValue() {
// Path: src/main/java/com/exmertec/dummie/cache/Constant.java
// public class Constant {
//     public static final String DEFAULT_STRING_VALUE = "DEFAULT.STRING-value";
// }
// 
// Path: src/main/java/com/exmertec/dummie/generator/data/DataGenerator.java
// public abstract class DataGenerator {
// 
//     private final List<FieldValueGenerator> generators;
// 
//     private final Set<String> randomFieldKeys;
// 
//     private final Set<Class<?>> randomFieldType;
// 
//     protected DataCache dataCache;
// 
//     protected GenerationStrategy strategy;
// 
//     public DataGenerator(GenerationStrategy strategy) {
//         this(strategy, new KeyValueDataCache());
//     }
// 
//     public DataGenerator(GenerationStrategy strategy, DataCache dataCache) {
//         this.dataCache = dataCache;
//         this.strategy = strategy;
// 
//         generators = new ArrayList<FieldValueGenerator>();
//         randomFieldKeys = new HashSet<String>();
//         randomFieldType = new HashSet<Class<?>>();
// 
//         addDefaultGenerators();
//     }
// 
//     private void addDefaultGenerators() {
//         generators.add(new StringFieldValueGenerator());
//         generators.add(new ListFieldValueGenerator());
//         generators.add(new MapFieldValueGenerator());
//         generators.add(new SetFieldValueGenerator());
//         generators.add(new BooleanFieldValueGenerator());
//         generators.add(new ByteFieldValueGenerator());
//         generators.add(new CharacterFieldValueGenerator());
//         generators.add(new DoubleFieldValueGenerator());
//         generators.add(new FloatFieldValueGenerator());
//         generators.add(new IntegerFieldValueGenerator());
//         generators.add(new LongFieldValueGenerator());
//         generators.add(new ShortFieldValueGenerator());
//         generators.add(new EnumFieldValueGenerator());
//         generators.add(new BigDecimalFieldValueGenerator());
//     }
// 
//     public Object getData(Field field) {
//         Class<?> fieldType = field.getType();
//         Object value = dataCache.getCachedData(fieldType, field.getName());
//         if (value == null) {
//             FieldValueGenerator generator = getGenerator(fieldType, field.getName());
//             if (generator != null) {
//                 value = generator.generate(this, field);
//             }
//         }
//         return value;
//     }
// 
//     public Object getData(Class<?> dataType, String key) {
//         Object value = dataCache.getCachedData(dataType, key);
//         if (value == null) {
//             FieldValueGenerator generator = getGenerator(dataType, key);
//             if (generator != null) {
//                 value = generator.generate(this, dataType, key);
//             }
//         }
//         return value;
//     }
// 
//     public <T> void cacheData(Class<T> dataType, String key, Object value) {
//         dataCache.cacheData(dataType, key, value);
//     }
// 
//     public <T> void cacheData(Class<T> clazz, Object value) {
//         dataCache.cacheData(clazz, value);
//     }
// 
//     public  <T> void dynamicCacheData(Class<T> dataType, String key, Object value) {
//         if (getStrategy(dataType, key) == GenerationStrategy.DEFAULT) {
//             dataCache.cacheData(dataType, key, value);
//         }
//     }
// 
//     public void random(Class<?> clazz) {
//         randomFieldType.add(clazz);
//     }
// 
//     public void random(String key) {
//         randomFieldKeys.add(key);
//     }
// 
//     protected GenerationStrategy getStrategy(Class<?> dataType, String key) {
//         return randomFieldType.contains(dataType) || randomFieldKeys.contains(key) ?
//             GenerationStrategy.RANDOM : strategy;
//     }
// 
//     protected FieldValueGenerator switchGeneratorStrategy(FieldValueGenerator generator,
//                                                           Class<?> dataType, String key) {
//         generator.setStrategy(getStrategy(dataType, key));
//         return generator;
//     }
// 
//     private FieldValueGenerator getGenerator(Class<?> dataType, String key) {
//         return switchGeneratorStrategy(getCachedGenerator(dataType), dataType, key);
//     }
// 
//     private FieldValueGenerator getCachedGenerator(Class<?> dataType) {
//         for (FieldValueGenerator generator: generators) {
//             if (generator.isMatchType(dataType)) {
//                 return generator;
//             }
//         }
// 
//         return getDefaultFieldValueGenerator(dataType);
//     }
// 
//     protected abstract FieldValueGenerator getDefaultFieldValueGenerator(Class<?> dataType);
// }
// 
// Path: src/main/java/com/exmertec/dummie/configuration/GenerationStrategy.java
// public enum GenerationStrategy {
//     DEFAULT, RANDOM
// }


// Path: src/main/java/com/exmertec/dummie/generator/field/FieldValueGenerator.java
import com.exmertec.dummie.cache.Constant;
import com.exmertec.dummie.generator.data.DataGenerator;
import com.exmertec.dummie.configuration.GenerationStrategy;
import java.lang.reflect.Field;
import java.util.UUID;

package com.exmertec.dummie.generator.field;



public abstract class FieldValueGenerator {
    private final Class<?>[] fieldTypes;
    protected GenerationStrategy strategy;

    protected FieldValueGenerator(Class<?>... fieldTypes) {
        this(GenerationStrategy.DEFAULT, fieldTypes);
    }

    protected FieldValueGenerator(GenerationStrategy strategy, Class<?>... fieldTypes) {
        this.strategy = strategy;
        this.fieldTypes = fieldTypes;
    }

    public Object generate(DataGenerator dataGenerator, Field field) {
        return generate(dataGenerator, field.getType(), field.getName());
    }

    public Object generate(DataGenerator dataGenerator, Class<?> fieldType, String fieldName) {
        switch (strategy) {
            case RANDOM:
                return randomGenerator(dataGenerator, fieldType, fieldName);
            case DEFAULT:
            default:
                return defaultGenerator(dataGenerator, fieldType, fieldName);
        }
    }

    protected String generateKeyValue() {
        return strategy == GenerationStrategy.RANDOM ? UUID.randomUUID().toString() : Constant.DEFAULT_STRING_VALUE;