package org.netbeans.gradle.model.util; import java.io.File; import java.util.Collections; import org.netbeans.gradle.model.BuildInfoBuilder; import org.netbeans.gradle.model.BuilderIssue; import org.netbeans.gradle.model.api.ModelClassPathDef; import org.netbeans.gradle.model.api.ProjectInfoBuilder2; import org.netbeans.gradle.model.internal.BuilderWrapper; public final class BuilderUtils { public static String getNameForEnumBuilder(Enum<?> instance) { return instance.getClass().getSimpleName() + '.' + instance.name(); } public static String getNameForGenericBuilder(Object instance, String args) { return instance.getClass().getSimpleName() + '(' + args + ')'; } public static ModelClassPathDef getClassPathOfBuilder(ProjectInfoBuilder2<?> builder) { Object currentObj = builder; Class<?> currentObjClass = currentObj.getClass(); while (currentObjClass != null) { File classPathOfClass = ModelClassPathDef.getClassPathOfClass(currentObjClass); if (!ModelClassPathDef.isImplicitlyAssumed(classPathOfClass)) { ClassLoader classLoader = currentObjClass.getClassLoader(); return ModelClassPathDef.fromJarFiles(classLoader, Collections.singleton(classPathOfClass)); } if (currentObj instanceof BuilderWrapper) { BuilderWrapper wrapper = (BuilderWrapper)currentObj; currentObjClass = wrapper.getWrappedType(); currentObj = wrapper.getWrappedObject(); } else { currentObjClass = null; currentObj = null; } } return ModelClassPathDef.EMPTY; } private static String getSafeToString(Object obj) { String className = obj.getClass().getSimpleName(); String toStringValue = obj.toString(); if (toStringValue == null) { return className; } else if (toStringValue.contains(className)) { return toStringValue; } else { return className + ": " + toStringValue; } } private static String getNameOfBuilderUnsafe(ProjectInfoBuilder2<?> builder) { if (builder == null) { return "null"; } String name = builder.getName(); // Although getName should never return null, // do something sensible anyway just to be safe. return name != null ? name : getSafeToString(builder); } private static String getNameOfBuilder(ProjectInfoBuilder2<?> builder, Throwable issue) { try { return getNameOfBuilderUnsafe(builder); } catch (Throwable ex) { Exceptions.tryAddSuppressedException(issue, ex); return builder != null ? builder.getClass().getName() : "null"; } } public static BuilderIssue createIssue( ProjectInfoBuilder2<?> builder, Throwable issue) { if (issue == null) { return null; } return new BuilderIssue(getNameOfBuilder(builder, issue), issue); } private static String getNameOfBuilderUnsafe(BuildInfoBuilder<?> builder) { if (builder == null) { return "null"; } String name = builder.getName(); // Although getName should never return null, // do something sensible anyway just to be safe. return name != null ? name : getSafeToString(builder); } private static String getNameOfBuilder(BuildInfoBuilder<?> builder, Throwable issue) { try { return getNameOfBuilderUnsafe(builder); } catch (Throwable ex) { Exceptions.tryAddSuppressedException(issue, ex); return builder != null ? builder.getClass().getName() : "null"; } } public static BuilderIssue createIssue( BuildInfoBuilder<?> builder, Throwable issue) { if (issue == null) { return null; } return new BuilderIssue(getNameOfBuilder(builder, issue), issue); } private BuilderUtils() { throw new AssertionError(); } }