diff --git a/src/main/java/ru/simplex_software/wicket_springdata/WicketEnumConverter.java b/src/main/java/ru/simplex_software/wicket_springdata/WicketEnumConverter.java new file mode 100644 index 0000000..21103f7 --- /dev/null +++ b/src/main/java/ru/simplex_software/wicket_springdata/WicketEnumConverter.java @@ -0,0 +1,81 @@ +package ru.simplex_software.wicket_springdata; + +import org.apache.wicket.util.convert.ConversionException; +import org.apache.wicket.util.convert.IConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; + +public class WicketEnumConverter implements IConverter { + private static final Logger LOG = LoggerFactory.getLogger(WicketEnumConverter.class); + + private static final Map, Properties> PROPERTIES_MAP = new HashMap<>(); + private Class enumClass; + + /** + * Enum in Constructor. + */ + public WicketEnumConverter(Class enumClass) { + this.enumClass = enumClass; + } + + @Override + public Enum convertToObject(String value, Locale locale) throws ConversionException { + Properties props = null; + try { + props = getProperties(); + } catch (IOException e) { + LOG.debug("Check Properties of " + value); + } + for (Map.Entry e : props.entrySet()) { + if (e.getValue().equals(value)) { + String key = (String) e.getKey(); + return Enum.valueOf(enumClass, key); + } + } + return null; + } + + @Override + public String convertToString(Object value, Locale locale) { + Enum statusValue = (Enum) value; + Properties props; + try { + props = getProperties(); + } catch (IOException e) { + LOG.error("Check Properties of " + value.getClass().getCanonicalName()); + throw new RuntimeException(e); + } + String key = statusValue.name(); + return props.getProperty(key); + } + + /** + * Load properties from file. + */ + private Properties getProperties() throws IOException { + Properties properties = PROPERTIES_MAP.get(enumClass); + if (properties != null) { + return properties; + } + properties = new Properties(); + synchronized (PROPERTIES_MAP) { + String fileName = "translations/" + enumClass.getCanonicalName() + ".properties"; + InputStream stream = enumClass.getClassLoader().getResourceAsStream(fileName); + if (stream == null) { // File not found. + LOG.debug("Не удалось найти файл свойств для " + enumClass.getName()); + throw new FileNotFoundException("Не удалось найти файл свойств для " + enumClass.getName()); + } + properties.load(stream); + PROPERTIES_MAP.put(enumClass, properties); + return properties; + } + } +}