package cz.habarta.typescript.generator.util; import java.io.File; import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; public class Utils { private Utils() { } public static String join(Iterable<? extends Object> values, String delimiter) { final StringBuilder sb = new StringBuilder(); boolean first = true; for (Object value : values) { if (first) { first = false; } else { sb.append(delimiter); } sb.append(value); } return sb.toString(); } public static String joinPath(String part1, String part2) { final List<String> parts = new ArrayList<>(); addPathPart(parts, part1); addPathPart(parts, part2); return join(parts, "/"); } private static void addPathPart(List<String> parts, String part) { if (part != null) { final String trimmed = trimSlash(part); if (!trimmed.isEmpty()) { parts.add(trimmed); } } } private static String trimSlash(String path) { path = path.startsWith("/") ? path.substring(1) : path; path = path.endsWith("/") ? path.substring(0, path.length() - 1) : path; return path; } public static Class<?> getRawClassOrNull(Type type) { if (type instanceof Class<?>) { return (Class<?>) type; } else if (type instanceof ParameterizedType) { final ParameterizedType parameterizedType = (ParameterizedType) type; final Type rawType = parameterizedType.getRawType(); if (rawType instanceof Class<?>) { return (Class<?>) rawType; } } return null; } public static <T> T getAnnotationElementValue(AnnotatedElement annotatedElement, String annotationClassName, String annotationElementName, Class<T> annotationElementType) { final Annotation annotation = getAnnotation(annotatedElement, annotationClassName); return getAnnotationElementValue(annotation, annotationElementName, annotationElementType); } public static Annotation getAnnotation(AnnotatedElement annotatedElement, String annotationClassName) { if (annotatedElement != null) { for (Annotation annotation : annotatedElement.getAnnotations()) { if (annotation.annotationType().getName().equals(annotationClassName)) { return annotation; } } } return null; } @SuppressWarnings("unchecked") public static <T> T getAnnotationElementValue(Annotation annotation, String annotationElementName, Class<T> annotationElementType) { try { if (annotation != null) { for (Method method : annotation.getClass().getMethods()) { if (method.getName().equals(annotationElementName)) { final Object value = method.invoke(annotation); if (annotationElementType.isInstance(value)) { return (T) value; } } } } return null; } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } public static ParameterizedType createParameterizedType(final Type rawType, final Type... actualTypeArguments) { final Type ownerType = null; return new ParameterizedType() { @Override public Type[] getActualTypeArguments() { return actualTypeArguments; } @Override public Type getRawType() { return rawType; } @Override public Type getOwnerType() { return ownerType; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof ParameterizedType) { final ParameterizedType that = (ParameterizedType) obj; return Objects.equals(ownerType, that.getOwnerType()) && Objects.equals(rawType, that.getRawType()) && Arrays.equals(actualTypeArguments, that.getActualTypeArguments()); } else { return false; } } @Override public int hashCode() { return Objects.hash(ownerType, rawType, actualTypeArguments); } }; } public static <T> List<T> concat(List<? extends T> list1, List<? extends T> list2) { if (list1 == null && list2 == null) { return null; } final List<T> result = new ArrayList<>(); if (list1 != null) result.addAll(list1); if (list2 != null) result.addAll(list2); return result; } public static <T> List<T> listFromNullable(T item) { return item != null ? Arrays.asList(item) : Collections.<T>emptyList(); } public static <T> List<T> listFromNullable(List<T> list) { return list != null ? list : Collections.<T>emptyList(); } public static <T> List<T> removeNulls(List<T> list) { final ArrayList<T> result = new ArrayList<>(list); result.removeAll(Collections.singleton(null)); return result; } public static List<String> readLines(InputStream stream) { return splitMultiline(readString(stream), false); } public static String readString(InputStream stream) { final Scanner s = new Scanner(stream, "UTF-8").useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } public static String readString(InputStream stream, String lineEndings) { return normalizeLineEndings(readString(stream), lineEndings); } private static String normalizeLineEndings(String text, String lineEndings) { return text.replaceAll("\\r\\n|\\n|\\r", lineEndings); } public static List<String> splitMultiline(String text, boolean trimLines) { final List<String> result = new ArrayList<>(); final String[] lines = text.split("\\r\\n|\\n|\\r"); for (String line : lines) { result.add(trimLines ? line.trim() : line); } return result; } public static File replaceExtension(File file, String newExtension) { final String name = file.getName(); final int dotIndex = name.lastIndexOf("."); final int index = dotIndex != -1 ? dotIndex : name.length(); return new File(file.getParent(), name.substring(0, index) + newExtension); } }