package org.solrmarc.index.mapping.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.PatternSyntaxException;
import org.solrmarc.index.extractor.impl.patternMapping.PatternMapping;
import org.solrmarc.index.indexer.IndexerSpecException;
import org.solrmarc.index.mapping.AbstractMultiValueMapping;
import org.solrmarc.index.mapping.AbstractValueMappingFactory;
public class PatternMappingFactory extends AbstractValueMappingFactory
{
@Override
public boolean canHandle(String mappingConfiguration)
{
return (mappingConfiguration.equals("map") || mappingConfiguration.equals("filter"));
}
@Override
public AbstractMultiValueMapping createMultiValueMapping(String mappingConfiguration)
{
int parenLoc = mappingConfiguration.indexOf("(");
return getMultiValuePattermMappingsFromString( mappingConfiguration.substring(0, parenLoc),
mappingConfiguration.substring(parenLoc + 1, mappingConfiguration.length() - 1));
}
@Override
public AbstractMultiValueMapping createMultiValueMapping(String[] mapParts)
{
if (mapParts.length > 2)
{
return(getMultiValuePattermMappingsFromStrings(mapParts[0], mapParts, 1));
}
else
{
return(getMultiValuePattermMappingsFromString(mapParts[0], mapParts[1]));
}
}
public static MultiValuePatternMapping getMultiValuePattermMappingsFromString(String mapType, String mapSpec)
{
final String mapParts[] = mapSpec.split("[|][|]");
return getMultiValuePattermMappingsFromStrings(mapType, mapParts, 0);
}
public static MultiValuePatternMapping getMultiValuePattermMappingsFromStrings(String mapType, String[] mapParts, int offset)
{
List<PatternMapping> pm = new ArrayList<PatternMapping>(mapParts.length);
boolean filter = (mapType.equals("filter")) ? true : false;
boolean matchAll = filter ? true : false;
boolean keepRaw = filter ? true : false;
for (int i = offset; i < mapParts.length; i++)
{
String mapEntry[] = mapParts[i].split("[ ]*=>[ ]*", 2);
if (mapEntry.length == 2)
{
mapEntry[0] = mapEntry[0].replaceAll("\\\\(.)", "$1");
try
{
pm.add(new PatternMapping(mapEntry[0], mapEntry[1], i));
}
catch (PatternSyntaxException pse)
{
throw new IndexerSpecException(
"Malformed regular expression in pattern map : " + mapEntry[0] + "\n" + pse.getMessage());
}
catch (IndexOutOfBoundsException ioobe)
{
throw new IndexerSpecException(
"Unknown group in replacement string : " + mapEntry[1] + "\n" + ioobe.getMessage());
}
}
else if (mapEntry.length == 1 && mapEntry[0].equals("filter"))
{
filter = true;
}
else if (mapEntry.length == 1 && mapEntry[0].equals("matchAll"))
{
matchAll = true;
}
else if (mapEntry.length == 1 && mapEntry[0].equals("keepRaw"))
{
keepRaw = true;
}
}
return new MultiValuePatternMapping(pm, filter, matchAll, keepRaw);
}
public static MultiValuePatternMapping pattermMappingsFromPatternProperties(Properties props)
{
List<PatternMapping> pm = new ArrayList<PatternMapping>(props.size());
boolean filter = false;
boolean matchAll = false;
boolean keepRaw = false;
for (int i = 0; i < props.size(); i++)
{
String key = "pattern_"+i;
String value = props.getProperty(key);
String mapEntry[] = value.split("[ ]*=>[ ]*", 2);
if (mapEntry.length == 2)
{
try
{
pm.add(new PatternMapping(mapEntry[0], mapEntry[1], i));
}
catch (PatternSyntaxException pse)
{
throw new IndexerSpecException(
"Malformed regular expression in pattern map : " + mapEntry[0] + "\n" + pse.getMessage());
}
catch (IndexOutOfBoundsException ioobe)
{
throw new IndexerSpecException(
"Unknown group in replacement string : " + mapEntry[1] + "\n" + ioobe.getMessage());
}
}
else if (mapEntry.length == 1 && mapEntry[0].equals("filter"))
{
filter = true;
}
else if (mapEntry.length == 1 && mapEntry.equals("matchAll"))
{
matchAll = true;
}
else if (mapEntry.length == 1 && mapEntry.equals("keepRaw"))
{
keepRaw = true;
}
}
return new MultiValuePatternMapping(pm, filter, matchAll, keepRaw);
}
}