package hycom.service; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; /** * Serwis do parsowania nazwy tabeli. */ @Service public class TableNameParser { private static int maxColumnName = 30; private static String tablePrefix = "ORBEON_F_"; /** * Konwerter nazwy tabeli. * @param appName nazwa Aplikacji formularza * @param formName nazwa Formy formularza * @return skrócona nazwa tabeli */ public static String convertTableName(String appName, String formName) { String appXML = xmlToSQLId(appName); String formXML = xmlToSQLId(formName); String viewName = tablePrefix + joinParts(Arrays.asList(appXML,formXML), maxColumnName - tablePrefix.length()); return viewName.toLowerCase(); } private static String joinParts(List parts, int max) { return String.join("_", fitParts(parts, max)); } private static String xmlToSQLId(String id){ String result = id.replaceAll("-", "_") .toUpperCase() // to uppercase .replaceAll("[^A-Z0-9_]", ""); result = StringUtils.stripStart(result, "_"); result = StringUtils.stripEnd(result, "_"); return result; } private static List fitParts(List parts, int max){ int usable = max - parts.size() + 1; return shaveParts(parts, usable); } private static List shaveParts(List parts, int usable){ List partsLength = parts.stream().map(String::length).collect(Collectors.toList()); int totalLength = parts.stream().mapToInt(String::length).sum(); if(totalLength <= usable) { return parts; } else { Integer maxPartLength = partsLength.stream().max(Comparator.naturalOrder()).orElseThrow(RuntimeException::new); int maxPartIndex = partsLength.indexOf(maxPartLength); String newPart = StringUtils.stripEnd(removeLastChar(parts.get(maxPartIndex)), "_"); List newParts = new ArrayList<>(parts); newParts.set(maxPartIndex, newPart); return shaveParts(newParts, usable); } } private static String removeLastChar(String str) { return str.substring(0, str.length() - 1); } }