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

com.github.nill14.utils.init.api.BindingKey Maven / Gradle / Ivy

The newest version!
package com.github.nill14.utils.init.api;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.annotation.Nullable;

import com.github.nill14.utils.init.meta.Annotations;
import com.google.common.reflect.TypeToken;

public final class BindingKey {


	public static  BindingKey of(Class clazz) {
		return new BindingKey<>(TypeToken.of(clazz), null);
	}
	
	public static  BindingKey of(TypeToken typeToken) {
		return new BindingKey<>(typeToken, null);
	}
	
	public static  BindingKey of(Class clazz, String named) {
		return new BindingKey<>(TypeToken.of(clazz), Annotations.named(named));
	}
	
	public static  BindingKey of(TypeToken typeToken, String named) {
		return new BindingKey<>(typeToken, Annotations.named(named));
	}
	
	public static  BindingKey of(Class clazz, Class annotationType) {
		return new BindingKey<>(TypeToken.of(clazz), Annotations.annotation(annotationType));
	}
	
	public static  BindingKey of(TypeToken typeToken, Class annotationType) {
		return new BindingKey<>(typeToken, Annotations.annotation(annotationType));
	}
	
	public static  BindingKey of(Class clazz, @Nullable Annotation qualifier) {
		return new BindingKey<>(TypeToken.of(clazz), qualifier);
	}
	
	public static  BindingKey of(TypeToken typeToken, @Nullable Annotation qualifier) {
		return new BindingKey<>(typeToken, qualifier);
	}
	
	private final TypeToken typeToken;
	private final @Nullable Annotation qualifier;

	/*temporarily package otherwise private*/ BindingKey(TypeToken typeToken, @Nullable Annotation qualifier) {
		this.typeToken = typeToken;
		this.qualifier = qualifier;
	}
	
	public Class getRawType() {
		return typeToken.getRawType();
	}

	public Type getGenericType() {
		return typeToken.getType();
	}
	
	public TypeToken getToken() {
		return typeToken;
	}

	public @Nullable Annotation getQualifier() {
		return qualifier;
	}
	
	public @Nullable Class getQualifierType() {
		if (qualifier != null) {
			return qualifier.annotationType();
		}
		return null;
	}
	
	public BindingKey withQualifier(Annotation qualifier) {
		return BindingKey.of(typeToken, qualifier);
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((qualifier == null) ? 0 : qualifier.hashCode());
		result = prime * result + ((typeToken == null) ? 0 : typeToken.hashCode());
		return result;
	}

	@SuppressWarnings("rawtypes")
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BindingKey other = (BindingKey) obj;
		if (qualifier == null) {
			if (other.qualifier != null)
				return false;
		} else if (!qualifier.equals(other.qualifier))
			return false;
		if (typeToken == null) {
			if (other.typeToken != null)
				return false;
		} else if (!typeToken.equals(other.typeToken))
			return false;
		return true;
	}

	@Override
	public String toString() {
		String name = typeToken.getRawType().getSimpleName();
		if (qualifier != null) {
			String packageName = qualifier.annotationType().getPackage().getName();
			String qName = qualifier.toString().replace(packageName + ".", "");
			return String.format("BindingKey(%s %s)", qName, name);
		}
		return name;
	}


	
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy