orbeon-bluedb-integration/integration-module/src/main/java/hycom/service/TableNameParser.java

75 lines
2.2 KiB
Java

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<String> 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<String> fitParts(List<String> parts, int max){
int usable = max - parts.size() + 1;
return shaveParts(parts, usable);
}
private static List<String> shaveParts(List<String> parts, int usable){
List<Integer> 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<String> 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);
}
}