From 31bab59d9ef45971b8cc35f6782613f063cbb670 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 9 Jul 2012 21:01:58 +0200 Subject: [PATCH] IDEA-60595 (Logger initialized with foreign class multiple logger classes) --- .../siyeh/InspectionGadgetsBundle.properties | 3 +- ...alizedWithForeignClassInspection.Form.form | 52 ------ ...InitializedWithForeignClassInspection.java | 169 ++++++++---------- .../LoggerInitializedWithForeignClass.html | 6 +- 4 files changed, 81 insertions(+), 149 deletions(-) delete mode 100644 plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.Form.form diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index de1f11defd23..e683df43c14e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1689,7 +1689,8 @@ assertequals.may.be.assertsame.problem.descriptor=#ref() may be 'as logger.initialized.with.foreign.class.quickfix=Replace with ''{0}.class'' logger.initialized.with.foreign.class.problem.descriptor=Logger initializer with foreign class #ref #loc logger.initialized.with.foreign.class.display.name=Logger initialized with foreign class -logger.factory.method.name=Logger factory &method: +logger.factory.methods.name=Logger factory methods +logger.factory.class.names=Logger factory class names make.static.final.quickfix=Make ''{0}'' static final logging.condition.disagrees.with.log.statement.display.name=Logging condition does not match log statement logging.condition.disagrees.with.log.statement.problem.descriptor=Logging condition #ref() does not match ''{0}()'' log statement #loc diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.Form.form b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.Form.form deleted file mode 100644 index 82fc8ab40e87..000000000000 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.Form.form +++ /dev/null @@ -1,52 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.java index 994ab1530a4c..1e5f57ce0650 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LoggerInitializedWithForeignClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Bas Leijdekkers + * Copyright 2008-2012 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,57 +15,72 @@ */ package com.siyeh.ig.logging; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.ui.ListTable; +import com.intellij.codeInspection.ui.ListWrappingTableModel; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.openapi.project.Project; -import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.util.IncorrectOperationException; +import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.ui.UiUtils; +import org.jdom.Element; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.text.Document; -import javax.swing.event.DocumentListener; -import javax.swing.event.DocumentEvent; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -public class LoggerInitializedWithForeignClassInspection - extends BaseInspection { +public class LoggerInitializedWithForeignClassInspection extends BaseInspection { + + @NonNls private static final String DEFAULT_LOGGER_CLASS_NAMES = "org.apache.log4j.Logger,org.slf4j.LoggerFactory"; + @NonNls private static final String DEFAULT_FACTORY_METHOD_NAMES = "getLogger,getLogger"; @SuppressWarnings({"PublicField"}) - public String loggerClassName = "org.apache.log4j.Logger"; + public String loggerClassName = DEFAULT_LOGGER_CLASS_NAMES; + private final List loggerFactoryClassNames = new ArrayList(); @SuppressWarnings({"PublicField"}) - public String loggerFactoryMethodName = "getLogger"; + public String loggerFactoryMethodName = DEFAULT_FACTORY_METHOD_NAMES; + private final List loggerFactoryMethodNames = new ArrayList(); + @Override @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "logger.initialized.with.foreign.class.display.name"); + return InspectionGadgetsBundle.message("logger.initialized.with.foreign.class.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "logger.initialized.with.foreign.class.problem.descriptor"); + return InspectionGadgetsBundle.message("logger.initialized.with.foreign.class.problem.descriptor"); } @Override public JComponent createOptionsPanel() { - return new Form().getContentPanel(); + final ListTable table = new ListTable( + new ListWrappingTableModel(Arrays.asList(loggerFactoryClassNames, loggerFactoryMethodNames), + InspectionGadgetsBundle.message("logger.factory.class.names"), + InspectionGadgetsBundle.message("logger.factory.methods.name"))); + return UiUtils.createAddRemovePanel(table); } + @Override @Nullable protected InspectionGadgetsFix buildFix(Object... infos) { return new LoggerInitializedWithForeignClassFix((String)infos[0]); } - private static class LoggerInitializedWithForeignClassFix - extends InspectionGadgetsFix { + private static class LoggerInitializedWithForeignClassFix extends InspectionGadgetsFix { private final String newClassName; @@ -73,6 +88,7 @@ public class LoggerInitializedWithForeignClassInspection this.newClassName = newClassName; } + @Override @NotNull public String getName() { return InspectionGadgetsBundle.message( @@ -80,28 +96,26 @@ public class LoggerInitializedWithForeignClassInspection newClassName); } - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement element = descriptor.getPsiElement(); if (!(element instanceof PsiClassObjectAccessExpression)) { return; } - final PsiClassObjectAccessExpression classObjectAccessExpression = - (PsiClassObjectAccessExpression)element; - replaceExpression(classObjectAccessExpression, - newClassName + ".class"); + final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression)element; + replaceExpression(classObjectAccessExpression, newClassName + ".class"); } } + @Override public BaseInspectionVisitor buildVisitor() { return new LoggerInitializedWithForeignClassVisitor(); } - private class LoggerInitializedWithForeignClassVisitor - extends BaseInspectionVisitor { + private class LoggerInitializedWithForeignClassVisitor extends BaseInspectionVisitor { - public void visitClassObjectAccessExpression( - PsiClassObjectAccessExpression expression) { + @Override + public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) { super.visitClassObjectAccessExpression(expression); final PsiElement parent = expression.getParent(); if (!(parent instanceof PsiExpressionList)) { @@ -111,10 +125,13 @@ public class LoggerInitializedWithForeignClassInspection if (!(grandParent instanceof PsiMethodCallExpression)) { return; } - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)grandParent; - final PsiClass containingClass = PsiTreeUtil.getParentOfType( - expression, PsiClass.class); + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)grandParent; + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] expressions = argumentList.getExpressions(); + if (expressions.length != 1) { + return; + } + final PsiClass containingClass = PsiTreeUtil.getParentOfType(expression, PsiClass.class); if (containingClass == null) { return; } @@ -122,19 +139,23 @@ public class LoggerInitializedWithForeignClassInspection if (containingClassName == null) { return; } - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final String referenceName = methodExpression.getReferenceName(); - if (!loggerFactoryMethodName.equals(referenceName)) { - return; - } final PsiMethod method = methodCallExpression.resolveMethod(); if (method == null) { return; } final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } final String className = aClass.getQualifiedName(); - if (!loggerClassName.equals(className)) { + final int index = loggerFactoryClassNames.indexOf(className); + if (index < 0) { + return; + } + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final String referenceName = methodExpression.getReferenceName(); + final String loggerFactoryMethodName = loggerFactoryMethodNames.get(index); + if (!loggerFactoryMethodName.equals(referenceName)) { return; } final PsiTypeElement operand = expression.getOperand(); @@ -154,60 +175,20 @@ public class LoggerInitializedWithForeignClassInspection } } - class Form { - - private JPanel contentPanel; - private JTextField loggerClassNameTextField; - private JTextField loggerFactoryMethodNameTextField; - - Form() { - loggerClassNameTextField.setText(loggerClassName); - final DocumentListener listener = new DocumentListener() { - - public void changedUpdate(DocumentEvent e) { - textChanged(); - } - - public void insertUpdate(DocumentEvent e) { - textChanged(); - } - - public void removeUpdate(DocumentEvent e) { - textChanged(); - } - - private void textChanged() { - loggerClassName = loggerClassNameTextField.getText(); - } - }; - final Document document = loggerClassNameTextField.getDocument(); - document.addDocumentListener(listener); - loggerFactoryMethodNameTextField.setText(loggerFactoryMethodName); - final DocumentListener factoryListener = new DocumentListener() { - - public void changedUpdate(DocumentEvent e) { - textChanged(); - } - - public void insertUpdate(DocumentEvent e) { - textChanged(); - } - - public void removeUpdate(DocumentEvent e) { - textChanged(); - } - - private void textChanged() { - loggerClassName = loggerClassNameTextField.getText(); - } - }; - final Document factoryDocument = - loggerFactoryMethodNameTextField.getDocument(); - factoryDocument.addDocumentListener(factoryListener); - } - - public JComponent getContentPanel() { - return contentPanel; + @Override + public void readSettings(Element element) throws InvalidDataException { + super.readSettings(element); + parseString(loggerClassName, loggerFactoryClassNames); + parseString(loggerFactoryMethodName, loggerFactoryMethodNames); + if (loggerFactoryClassNames.size() != loggerFactoryMethodNames.size()) { + parseString(DEFAULT_LOGGER_CLASS_NAMES, loggerFactoryClassNames); + parseString(DEFAULT_FACTORY_METHOD_NAMES, loggerFactoryMethodNames); } } -} + + @Override + public void writeSettings(Element element) throws WriteExternalException { + loggerClassName = formatString(loggerFactoryClassNames); + loggerFactoryMethodName = formatString(loggerFactoryMethodNames); + super.writeSettings(element); + }} diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/LoggerInitializedWithForeignClass.html b/plugins/InspectionGadgets/src/inspectionDescriptions/LoggerInitializedWithForeignClass.html index c3571ad76388..86cacf6d8abc 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/LoggerInitializedWithForeignClass.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/LoggerInitializedWithForeignClass.html @@ -1,8 +1,10 @@ -This inspection reports any Loggers which are -initialized with a class literal from a different class than the Logger +This inspection reports any Loggers which are initialized with a class literal from a different class than the Logger is contained in. + +

+Use the table below to specify the logger factory classes and logger factory methods recognized by this inspection.

New in 8, Powered by InspectionGadgets