package jj.resource;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* A tuple that identifies a given resource, but is not instance specific
* @author jason
*/
public class ResourceIdentifier<T extends Resource<A>, A> {
public final Class<T> resourceClass;
public final Location base;
public final String name;
public final A argument;
private final String stringRep;
ResourceIdentifier(Class<T> resourceClass, Location base, String name, A argument) {
this.resourceClass = resourceClass;
this.base = base;
this.name = name;
this.argument = argument;
stringRep = stringify(resourceClass, base, name, argument);
}
private String stringify(Class<?> resourceClass, Location base, String name, Object argument) {
return namifyType(resourceClass) +
"@" +base +"/" + name +
(argument == null ? "" : "{" + argument + "}");
}
private String namifyType(Class<?> resourceClass) {
String name = resourceClass.getCanonicalName();
StringBuilder out = new StringBuilder(name.length());
for (int i = 0; i < name.length();) {
int next = name.indexOf('.', i);
if (next == -1) {
out.append(name.substring(i));
break;
}
out.append(name.charAt(i)).append('.');
i = next + 1;
}
return out.toString();
}
@Override
public boolean equals(Object obj) {
return obj instanceof ResourceIdentifier && stringRep.equals(obj.toString());
}
public boolean equals(Class<?> resourceClass, Location base, String name, Object argument) {
return stringRep.equals(stringify(resourceClass, base, name, argument));
}
@Override
public String toString() {
return stringRep;
}
@Override
public int hashCode() {
return stringRep.hashCode();
}
}