package org.solrmarc.index.extractor.methodcall;
import java.util.Collection;
import java.util.Collections;
import org.marc4j.marc.Record;
import org.solrmarc.index.extractor.AbstractMultiValueExtractor;
import org.solrmarc.index.extractor.ExternalMethod;
public class MethodCallSingleValueExtractor extends AbstractMultiValueExtractor implements ExternalMethod
{
private final AbstractExtractorMethodCall<String> methodCall;
private final Object[] parameters;
public MethodCallSingleValueExtractor(final AbstractExtractorMethodCall<String> methodCall,
final Object[] parameters)
{
if (methodCall == null)
{
throw new NullPointerException("CustomObject is null");
}
else if (parameters == null)
{
throw new NullPointerException("Custom parameters is null");
}
this.methodCall = methodCall;
this.parameters = new Object[parameters.length + 1];
System.arraycopy(parameters, 0, this.parameters, 1, parameters.length);
}
@SuppressWarnings("unchecked")
private MethodCallSingleValueExtractor(MethodCallSingleValueExtractor toClone)
{
this.methodCall = (AbstractExtractorMethodCall<String>) toClone.methodCall.makeThreadSafeCopy();
this.parameters = new Object[toClone.parameters.length];
System.arraycopy(toClone.parameters, 0, this.parameters, 0, toClone.parameters.length);
}
@SuppressWarnings("unchecked")
@Override
public Collection<String> extract(final Record record) throws Exception
{
Object result = methodCall.invoke(record, parameters);
if (result == null)
return(Collections.EMPTY_LIST);
else
return(Collections.singletonList((String)result));
}
@Override
public boolean isThreadSafe()
{
return methodCall.isThreadSafe();
}
@Override
public Object makeThreadSafeCopy()
{
return new MethodCallSingleValueExtractor(this);
}
}