package de.plushnikov.intellij.plugin.action.lombok; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiModifier; import com.intellij.refactoring.rename.RenameProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.AbstractLogProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.CommonsLogProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.JBossLogProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.Log4j2Processor; import de.plushnikov.intellij.plugin.processor.clazz.log.Log4jProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.LogProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.Slf4jProcessor; import de.plushnikov.intellij.plugin.processor.clazz.log.XSlf4jProcessor; import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Collection; public class LombokLoggerHandler extends BaseLombokHandler { protected void processClass(@NotNull PsiClass psiClass) { final Collection<AbstractLogProcessor> logProcessors = Arrays.asList( new CommonsLogProcessor(), new JBossLogProcessor(), new Log4jProcessor(), new Log4j2Processor(), new LogProcessor(), new Slf4jProcessor(), new XSlf4jProcessor()); final String lombokLoggerName = AbstractLogProcessor.getLoggerName(psiClass); final boolean lombokLoggerIsStatic = AbstractLogProcessor.isLoggerStatic(psiClass); for (AbstractLogProcessor logProcessor : logProcessors) { for (PsiField psiField : psiClass.getFields()) { if (psiField.getType().equalsToText(logProcessor.getLoggerType()) && checkLoggerField(psiField, lombokLoggerName, lombokLoggerIsStatic)) { processLoggerField(psiField, psiClass, logProcessor, lombokLoggerName); } } } } private void processLoggerField(@NotNull PsiField psiField, @NotNull PsiClass psiClass, @NotNull AbstractLogProcessor logProcessor, @NotNull String lombokLoggerName) { if (!lombokLoggerName.equals(psiField.getName())) { RenameProcessor processor = new RenameProcessor(psiField.getProject(), psiField, lombokLoggerName, false, false); processor.doRun(); } addAnnotation(psiClass, logProcessor.getSupportedAnnotationClasses()[0]); psiField.delete(); } private boolean checkLoggerField(@NotNull PsiField psiField, @NotNull String lombokLoggerName, boolean lombokLoggerIsStatic) { if (!isValidLoggerField(psiField, lombokLoggerName, lombokLoggerIsStatic)) { int result = Messages.showOkCancelDialog( String.format("Logger field: \"%s\" Is not private %s final field named \"%s\". Refactor anyway?", psiField.getName(), lombokLoggerIsStatic ? "static" : "", lombokLoggerName), "Attention!", Messages.getQuestionIcon()); return DialogWrapper.OK_EXIT_CODE == result; } return true; } private boolean isValidLoggerField(@NotNull PsiField psiField, @NotNull String lombokLoggerName, boolean lombokLoggerIsStatic) { boolean isPrivate = psiField.hasModifierProperty(PsiModifier.PRIVATE); boolean isStatic = lombokLoggerIsStatic == psiField.hasModifierProperty(PsiModifier.STATIC); boolean isFinal = psiField.hasModifierProperty(PsiModifier.FINAL); boolean isProperlyNamed = lombokLoggerName.equals(psiField.getName()); return isPrivate & isStatic & isFinal & isProperlyNamed; } }