package org.solrmarc.index.extractor.methodcall;
import org.marc4j.marc.Record;
import java.util.Arrays;
public class MethodCallContext
{
private String typeName;
private String objectName;
private String methodName;
private String[] parameters;
private Class<?>[] parameterTypes;
protected MethodCallContext(final String typeName, final String objectName, final String methodName,
final String[] parameters, final Class<?>[] parameterTypes)
{
this.typeName = typeName;
this.objectName = objectName;
this.methodName = methodName;
this.parameters = parameters;
this.parameterTypes = parameterTypes;
}
public static MethodCallContext parseContextFromExtractorParts(String[] extParts)
{
final String typeName = extParts[0];
final String objectName = extParts[1];
// mappingConfiguration.skipUntilAfter(',');
final String methodName = extParts[2];
final String[] parameters = getParameters(extParts, 3);
final Class<?>[] parameterTypes = getExtractorParameterTypes(parameters);
return new MethodCallContext(typeName, objectName, methodName, parameters, parameterTypes);
}
public static MethodCallContext parseContextFromMapParts(String[] mapParts)
{
final String typeName = mapParts[0];
final String objectName = mapParts[1];
// mappingConfiguration.skipUntilAfter(' ');
final String methodName = mapParts[2];
final String[] parameters = getParameters(mapParts, 3);
final Class<?>[] parameterTypes = getMappingParameterTypes(parameters);
return new MethodCallContext(typeName, objectName, methodName, parameters, parameterTypes);
}
protected static Class<?>[] getExtractorParameterTypes(final String[] parameters)
{
final Class<?>[] parameterTypes = new Class[parameters.length + 1];
parameterTypes[0] = Record.class;
Arrays.fill(parameterTypes, 1, parameters.length + 1, String.class);
return parameterTypes;
}
protected static Class<?>[] getMappingParameterTypes(final String[] parameters)
{
final Class<?>[] parameterTypes = new Class[parameters.length + 1];
parameterTypes[0] = Object.class;
Arrays.fill(parameterTypes, 1, parameters.length + 1, String.class);
return parameterTypes;
}
private static String[] getParameters(String[] mapParts, int numToDiscard)
{
if (mapParts.length <= numToDiscard)
{
return new String[0];
}
else
{
String result[] = new String[mapParts.length - numToDiscard];
System.arraycopy(mapParts, numToDiscard, result, 0, mapParts.length - numToDiscard);
return result;
}
}
public String getTypeName()
{
return typeName;
}
public String getObjectName()
{
return objectName;
}
public String getMethodName()
{
return methodName;
}
public String[] getParameters()
{
return parameters;
}
public Class<?>[] getParameterTypes()
{
return parameterTypes;
}
@Override
public String toString()
{
return objectName + "." + methodName + Arrays.toString(parameterTypes);
}
}