package org.solrmarc.index.mapping.impl;
import org.apache.log4j.Logger;
import org.solrmarc.index.indexer.ValueIndexerFactory;
import org.solrmarc.index.mapping.AbstractMultiValueMapping;
import org.solrmarc.index.mapping.AbstractValueMappingFactory;
import org.solrmarc.tools.PropertyUtils;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class TranslationMappingFactory extends AbstractValueMappingFactory
{
private final static Logger logger = Logger.getLogger(TranslationMappingFactory.class);
private final static Map<String, Properties> translationMappingFiles = new HashMap<>();
@Override
public boolean canHandle(String mappingConfiguration)
{
return mappingConfiguration.endsWith(".properties")
|| (mappingConfiguration.contains(".properties(") && mappingConfiguration.endsWith(")"));
}
private Properties loadTranslationMappingFile(String translationMappingFileName, String subMappingName)
{
Properties properties = translationMappingFiles.get(translationMappingFileName + "(" + subMappingName + ")");
if (properties != null)
{
return properties;
}
if (translationMappingFileName.equals("(this).properties"))
{
properties = ValueIndexerFactory.instance().getLocalMappingProperties();
}
else
{
properties = translationMappingFiles.get(translationMappingFileName + "(null)");
}
if (properties != null)
{
properties = getSubTranslationMapping(properties, subMappingName);
translationMappingFiles.put(translationMappingFileName + "(" + subMappingName + ")", properties);
return properties;
}
String[] filenameOpened = new String[]{null};
properties = PropertyUtils.loadProperties(ValueIndexerFactory.instance().getHomeDirs(), "translation_maps" + File.separator + translationMappingFileName, filenameOpened);
logger.debug("Load translation map: "+ translationMappingFileName+ " from file : " +filenameOpened[0]);
translationMappingFiles.put(translationMappingFileName + "(null)", properties);
if (subMappingName != null)
{
properties = getSubTranslationMapping(properties, subMappingName);
translationMappingFiles.put(translationMappingFileName + "(" + subMappingName + ")", properties);
}
return properties;
}
private Properties getSubTranslationMapping(Properties translationMapping, String mappingPrefix)
{
Properties mappings = new Properties();
for (String key : translationMapping.stringPropertyNames())
{
if (key.startsWith(mappingPrefix+"."))
{
String value = translationMapping.getProperty(key);
// if (value.equals("null"))
// {
// value = null;
// }
if (key.length() == mappingPrefix.length())
{
// remove prefix. There is no period.
mappings.setProperty("", value);
}
else
{
// remove prefix and period.
mappings.setProperty(key.substring(mappingPrefix.length() + 1), value);
}
}
}
return mappings;
}
private String getTranslationMappingFileName(String mappingConfiguration)
{
if (mappingConfiguration.equals("(this).properties"))
return(mappingConfiguration);
int index = mappingConfiguration.indexOf('(');
if (index != -1)
{
return mappingConfiguration.substring(0, index);
}
else
{
return mappingConfiguration;
}
}
private String getSubMappingName(String mappingConfiguration)
{
int index = mappingConfiguration.indexOf('(');
if (index != -1)
{
return mappingConfiguration.substring(index + 1, mappingConfiguration.length() - 1);
}
else
{
return null;
}
}
// @Override
// public AbstractSingleValueMapping createSingleValueMapping(String
// mappingConfiguration) {
// final String translationMappingFileName =
// getTranslationMappingFileName(mappingConfiguration);
// final String subMappingName = getSubMappingName(mappingConfiguration);
// final Properties translationMapping =
// loadTranslationMappingFile(translationMappingFileName, subMappingName);
// return new SingleValueTranslationMapping(translationMapping);
// }
@Override
public AbstractMultiValueMapping createMultiValueMapping(String mappingConfiguration)
{
String translationMappingFileName = getTranslationMappingFileName(mappingConfiguration);
final String subMappingName = getSubMappingName(mappingConfiguration);
Properties translationMapping = loadTranslationMappingFile(translationMappingFileName, subMappingName);
if (translationMapping.containsKey("pattern_0"))
{
return PatternMappingFactory.pattermMappingsFromPatternProperties(translationMapping);
}
else
{
return new MultiValueTranslationMapping(translationMapping);
}
}
@Override
public AbstractMultiValueMapping createMultiValueMapping(String[] mapParts)
{
String translationMappingFileName = getTranslationMappingFileName(mapParts[0]);
final String subMappingName = mapParts.length > 1 ? mapParts[1] : null;
Properties translationMapping = loadTranslationMappingFile(translationMappingFileName, subMappingName);
if (translationMapping.containsKey("pattern_0"))
{
return PatternMappingFactory.pattermMappingsFromPatternProperties(translationMapping);
}
else
{
return new MultiValueTranslationMapping(translationMapping);
}
}
}