package com.ibm.nmon.data.transform.name; import org.slf4j.Logger; import java.util.List; import java.util.Map; import java.io.IOException; import java.io.File; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ibm.nmon.data.matcher.ExactHostMatcher; import com.ibm.nmon.data.matcher.HostMatcher; import com.ibm.nmon.data.matcher.RegexHostMatcher; public final class HostRenamerFactory { private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(HostRenamerFactory.class); private static final ObjectMapper MAPPER = new ObjectMapper(); public static HostRenamer loadFromFile(File file) throws IOException, IllegalArgumentException { List<Map<String, String>> data = MAPPER.readValue(file, new TypeReference<List<Map<String, String>>>() {}); HostRenamer renamer = new HostRenamer(); for (Map<String, String> map : data) { String alias = map.get("alias"); NameTransformer transformer = null; HostMatcher matcher = null; if (alias != null) { if ("$LPAR".equals(alias)) { transformer = new LPARNameTransformer(null); } else if ("$RUN".equals(alias)) { transformer = new NMONRunNameTransformer(null); } else { transformer = new SimpleNameTransformer(alias); } } else { String regex = map.get("aliasRegex"); if (regex == null) { // try to reuse existing regex regex = map.get("regex"); } if (regex != null) { String group = map.get("aliasByGroup"); if (group == null) { String replacement = map.get("aliasByReplacement"); if ((replacement != null) && !"".equals(replacement)) { transformer = new RegexNameTransformer(regex, replacement); } else { transformer = new RegexNameTransformer(regex); } } else { try { transformer = new RegexNameTransformer(regex, Integer.parseInt(group)); } catch (NumberFormatException nfe) { LOGGER.warn("'aliasByGroup' must be a number"); transformer = new RegexNameTransformer(regex); } } } else { LOGGER.warn("either 'alias', 'aliasRegex' or 'regex'" + " must be defined for " + "each host"); } } String name = map.get("name"); if (name != null) { matcher = new ExactHostMatcher(name); } else { name = map.get("regex"); if (name == null) { matcher = HostMatcher.ALL; } else { matcher = new RegexHostMatcher(name); } } LOGGER.debug("will rename '{}' to '{}'", matcher, transformer); renamer.addRenamer(matcher, transformer); } return renamer; } private HostRenamerFactory() {} }