75 lines
2.2 KiB
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);
|
|
}
|
|
}
|