package com.technophobia.substeps.document.content.view.hover.model.javadoc; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import com.technophobia.eclipse.javadoc.ProjectJavaDocLocator; import com.technophobia.substeps.FeatureEditorPlugin; import com.technophobia.substeps.editor.message.SubstepsEditorMessages; import com.technophobia.substeps.glossary.StepDescriptor; import com.technophobia.substeps.model.StepImplementation; import com.technophobia.substeps.supplier.Transformer; public class JavaDocForStepImplementationLocator implements ProjectJavaDocLocator<StepImplementation> { private final ProjectJavaDocLocator<StepImplTypeContext> sourceJavaDocLocator; private final ProjectJavaDocLocator<StepImplTypeContext> binaryJavaDocLocator; public JavaDocForStepImplementationLocator( final Transformer<StepDescriptor, String> stepDescriptorToStringTransformer) { this(new JavaDocForSourceStepLocator(stepDescriptorToStringTransformer), new JavaDocForBinaryStepLocator( stepDescriptorToStringTransformer)); } public JavaDocForStepImplementationLocator(final ProjectJavaDocLocator<StepImplTypeContext> sourceJavaDocLocator, final ProjectJavaDocLocator<StepImplTypeContext> binaryJavaDocLocator) { this.sourceJavaDocLocator = sourceJavaDocLocator; this.binaryJavaDocLocator = binaryJavaDocLocator; } @Override public String formattedJavaDocFor(final StepImplementation stepImplementation, final IJavaProject project) { final IType type = locateTypeForStep(stepImplementation, project); if (type != null) { final String javadoc = type.isBinary() ? binaryTypeJavadoc(stepImplementation, project, type) : sourceTypeJavadoc(stepImplementation, project, type); return isNotBlank(javadoc) ? javadoc : noJavaDocMessage(); } return null; } private String noJavaDocMessage() { final StringBuilder sb = new StringBuilder(); sb.append(SubstepsEditorMessages.StepImplementationHoverModel_No_JavaDoc); sb.append("\n\n"); sb.append(SubstepsEditorMessages.StepImplementationHoverModel_No_JavaDoc_Recommendation); return sb.toString(); } private boolean isNotBlank(final String content) { return content != null && content.trim().length() > 0; } private IType locateTypeForStep(final StepImplementation stepImplementation, final IJavaProject project) { try { return project.findType(stepImplementation.getImplementedIn().getName()); } catch (final JavaModelException ex) { FeatureEditorPlugin.instance().error( "Could not find type for step implementation " + stepImplementation + " in project " + project, ex); return null; } } private String binaryTypeJavadoc(final StepImplementation stepImplementation, final IJavaProject project, final IType type) { return binaryJavaDocLocator.formattedJavaDocFor(StepImplTypeContext.with(type, stepImplementation), project); } private String sourceTypeJavadoc(final StepImplementation stepImplementation, final IJavaProject project, final IType type) { return sourceJavaDocLocator.formattedJavaDocFor(StepImplTypeContext.with(type, stepImplementation), project); } }