/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.velocity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.velocity.app.event.ReferenceInsertionEventHandler;
import org.ldaptive.SearchFilter;
/**
* Insertion event handler that encodes the inserted value using {@link SearchFilter#encodeValue(String)} or {@link
* SearchFilter#encodeValue(byte[])}
*
* @author Middleware Services
*/
public class EscapingReferenceInsertionEventHandler implements ReferenceInsertionEventHandler
{
@Override
public Object referenceInsert(final String reference, final Object value)
{
Object output = null;
if (value != null) {
if (value instanceof Object[]) {
final List<Object> encodedValues = new ArrayList<>();
for (Object o : (Object[]) value) {
encodedValues.add(encode(o));
}
output = encodedValues.toArray();
} else if (value instanceof Collection<?>) {
output = ((Collection<?>) value).stream().map(this::encode).collect(Collectors.toList());
} else {
output = encode(value);
}
}
return output;
}
/**
* Returns {@link SearchFilter#encodeValue} if value is a string.
*
* @param value to encode
*
* @return encoded value if value is a string
*/
private Object encode(final Object value)
{
if (value == null) {
return null;
}
String s;
if (value instanceof String){
s = SearchFilter.encodeValue((String) value);
} else if (value instanceof byte[]) {
s = SearchFilter.encodeValue((byte[]) value);
} else {
s = SearchFilter.encodeValue(value.toString());
}
return s;
}
}