// Path: src/main/java/com/bretpatterson/schemagen/graphql/datafetchers/DefaultMethodDataFetcher.java
// public class DefaultMethodDataFetcher implements IMethodDataFetcher {
// 
// 	private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMethodDataFetcher.class);
// 	protected ITypeFactory typeFactory;
// 
// 	protected Method method;
// 	protected String fieldName;
// 	protected Optional<Object> targetObject = Optional.absent();
// 	protected LinkedHashMap<String, Type> argumentTypeMap = new LinkedHashMap<>();
// 	protected Map<String, Object> parameterDefaultValue = Maps.newHashMap();
// 
// 	@Override
// 	public void setTargetObject(Object targetObject) {
// 		this.targetObject = Optional.fromNullable(targetObject);
// 	}
// 
// 	@Override
// 	public void addParam(String name, Type type, Optional<Object> defaultValue) {
// 		argumentTypeMap.put(name, type);
// 		if (defaultValue.isPresent()) {
// 			parameterDefaultValue.put(name, defaultValue.get());
// 		}
// 	}
// 
// 	Object getDefaultValue(DataFetchingEnvironment environment, String name, Type argumentType) {
// 		if (parameterDefaultValue.containsKey(name)) {
// 			return typeFactory.convertToType(argumentTypeMap.get(name), parameterDefaultValue.get(name));
// 		} else {
// 			return null;
// 		}
// 	}
// 
// 	Object convertToType(Type argumentType, Object value) {
// 		if (value == null)
// 			return value;
// 
// 		return typeFactory.convertToType(argumentType, value);
// 	}
// 
// 	Object getParamValue(DataFetchingEnvironment environment, String argumentName, Type argumentType) {
// 		Object value = environment.getArgument(argumentName);
// 		if (value == null) {
// 			value = getDefaultValue(environment, argumentName, argumentType);
// 		}
// 		return convertToType(argumentType, value);
// 	}
// 
// 	@Override
// 	public Object get(DataFetchingEnvironment environment) {
// 
// 		for (Field field : environment.getFields()) {
// 			if (field.getName().equals(fieldName)) {
// 				Object[] arguments = new Object[argumentTypeMap.size()];
// 				int index = 0;
// 				for (String argumentName : argumentTypeMap.keySet()) {
// 					arguments[index] = getParamValue(environment, argumentName, argumentTypeMap.get(argumentName));
// 					index++;
// 				}
// 				return invokeMethod(environment, method, targetObject.isPresent() ? targetObject.get() : environment.getSource(), arguments);
// 			}
// 		}
// 		return null;
// 
// 	}
// 
// 	@Override
// 	public Object invokeMethod(DataFetchingEnvironment environment, Method method, Object target, Object[] arguments) {
// 		try {
// 			return method.invoke(target, (Object[]) arguments);
// 		} catch (Exception ex) {
// 			LOGGER.error("Unexpected exception.", ex);
// 			throw Throwables.propagate(ex);
// 		}
// 	}
// 
// 	@Override
// 	public void setFieldName(String fieldName) {
// 		this.fieldName = fieldName;
// 	}
// 
// 	@Override
// 	public void setMethod(Method method) {
// 		this.method = method;
// 	}
// 
// 	@Override
// 	public void setTypeFactory(ITypeFactory typeFactory) {
// 		this.typeFactory = typeFactory;
// 	}
// }


import com.bretpatterson.schemagen.graphql.datafetchers.DefaultMethodDataFetcher;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.ClassPath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
package com.bretpatterson.schemagen.graphql.utils;



/**
 * Common Annotation related utility methods.
 */
public class AnnotationUtils {

	private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationUtils.class);
	public static final String DEFAULT_NULL = "\n\t\t\n\t\t\n\uE000\uE001\uE002\n\t\t\t\t\n";
	private static ClassLoader classLoader;
	private static ClassPath classPath;

// Path: src/main/java/com/bretpatterson/schemagen/graphql/datafetchers/DefaultMethodDataFetcher.java
// public class DefaultMethodDataFetcher implements IMethodDataFetcher {
// 
// 	private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMethodDataFetcher.class);
// 	protected ITypeFactory typeFactory;
// 
// 	protected Method method;
// 	protected String fieldName;
// 	protected Optional<Object> targetObject = Optional.absent();
// 	protected LinkedHashMap<String, Type> argumentTypeMap = new LinkedHashMap<>();
// 	protected Map<String, Object> parameterDefaultValue = Maps.newHashMap();
// 
// 	@Override
// 	public void setTargetObject(Object targetObject) {
// 		this.targetObject = Optional.fromNullable(targetObject);
// 	}
// 
// 	@Override
// 	public void addParam(String name, Type type, Optional<Object> defaultValue) {
// 		argumentTypeMap.put(name, type);
// 		if (defaultValue.isPresent()) {
// 			parameterDefaultValue.put(name, defaultValue.get());
// 		}
// 	}
// 
// 	Object getDefaultValue(DataFetchingEnvironment environment, String name, Type argumentType) {
// 		if (parameterDefaultValue.containsKey(name)) {
// 			return typeFactory.convertToType(argumentTypeMap.get(name), parameterDefaultValue.get(name));
// 		} else {
// 			return null;
// 		}
// 	}
// 
// 	Object convertToType(Type argumentType, Object value) {
// 		if (value == null)
// 			return value;
// 
// 		return typeFactory.convertToType(argumentType, value);
// 	}
// 
// 	Object getParamValue(DataFetchingEnvironment environment, String argumentName, Type argumentType) {
// 		Object value = environment.getArgument(argumentName);
// 		if (value == null) {
// 			value = getDefaultValue(environment, argumentName, argumentType);
// 		}
// 		return convertToType(argumentType, value);
// 	}
// 
// 	@Override
// 	public Object get(DataFetchingEnvironment environment) {
// 
// 		for (Field field : environment.getFields()) {
// 			if (field.getName().equals(fieldName)) {
// 				Object[] arguments = new Object[argumentTypeMap.size()];
// 				int index = 0;
// 				for (String argumentName : argumentTypeMap.keySet()) {
// 					arguments[index] = getParamValue(environment, argumentName, argumentTypeMap.get(argumentName));
// 					index++;
// 				}
// 				return invokeMethod(environment, method, targetObject.isPresent() ? targetObject.get() : environment.getSource(), arguments);
// 			}
// 		}
// 		return null;
// 
// 	}
// 
// 	@Override
// 	public Object invokeMethod(DataFetchingEnvironment environment, Method method, Object target, Object[] arguments) {
// 		try {
// 			return method.invoke(target, (Object[]) arguments);
// 		} catch (Exception ex) {
// 			LOGGER.error("Unexpected exception.", ex);
// 			throw Throwables.propagate(ex);
// 		}
// 	}
// 
// 	@Override
// 	public void setFieldName(String fieldName) {
// 		this.fieldName = fieldName;
// 	}
// 
// 	@Override
// 	public void setMethod(Method method) {
// 		this.method = method;
// 	}
// 
// 	@Override
// 	public void setTypeFactory(ITypeFactory typeFactory) {
// 		this.typeFactory = typeFactory;
// 	}
// }


// Path: src/main/java/com/bretpatterson/schemagen/graphql/utils/AnnotationUtils.java
import com.bretpatterson.schemagen.graphql.datafetchers.DefaultMethodDataFetcher;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.ClassPath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

package com.bretpatterson.schemagen.graphql.utils;



/**
 * Common Annotation related utility methods.
 */
public class AnnotationUtils {

	private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationUtils.class);
	public static final String DEFAULT_NULL = "\n\t\t\n\t\t\n\uE000\uE001\uE002\n\t\t\t\t\n";
	private static ClassLoader classLoader;
	private static ClassPath classPath;

	public final static class DEFAULT_NULL_CLASS extends DefaultMethodDataFetcher {}