GithubHelp home page GithubHelp logo

kengotoda / findbugs-slf4j Goto Github PK

View Code? Open in Web Editor NEW
75.0 7.0 11.0 681 KB

A SpotBugs/FindBugs plugin to verify usage of SLF4J

Home Page: http://kengotoda.github.io/findbugs-slf4j/

License: Apache License 2.0

Java 99.46% Dockerfile 0.54%
spotbugs slf4j findbugs-plugin java findbugs spotbugs-plugin

findbugs-slf4j's Introduction

FindBugs bug pattern for SLF4J

This product helps you to verify usage of SLF4J 1.6, 1.7 and 1.8. Works with Java8 and later.

To use this plugin with SonarQube, see here. To detect problems at compile time, see errorprone-slf4j.

Quality Gate Maven Central

Motivation

SLF4J is useful logging facade, but sometimes we mistake how to use. Can you find mistakes in following class? It is not so easy especially in huge product, this FindBugs plugin will help you to find.

class Foo {
    private static final Logger logger = LoggerFactory.getLogger(Bar.class);

    void rethrow(String name, Throwable t) {
        logger.info("Hello, {}!");
        logger.warn("Now I will wrap and throw {}", t);
        throw new RuntimeException(t);
    }
}

Provided bug patterns

Currently this product provides 9 patterns.

SLF4J_PLACE_HOLDER_MISMATCH

This pattern checks how placeholder is used. Alert if count of placeholder does not match to count of parameter.

Note: Format should be CONST to use this bug pattern. Use SLF4J_FORMAT_SHOULD_BE_CONST bug pattern to check it.

class Foo {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    void method() {
        // invalid: this logging method has 2 placeholders, but given parameter is only 1.
        logger.info("{}, {}.", "Hello");

        // valid
        logger.info("{}, {}.", "Hello", "World");

        // invalid: Throwable instance does not need placeholder
        logger.error("{}, {}", "Hello", new RuntimeException());

        // valid
        logger.error("{}", "Hello", new RuntimeException());
    }
}

SLF4J_FORMAT_SHOULD_BE_CONST

This pattern checks given format is CONST or not. Alert if format is not CONST.

class Foo {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    void method() {
        // invalid: format is not CONST
        String format = new String("Hello, ");
        logger.info(format + "{}.", "World");

        // valid
        logger.info("Hello, {}.", "World");
    }
}

SLF4J_UNKNOWN_ARRAY

This pattern reports a bug if your code is using array which is provided as method argument or returned from other method. It makes our verification harder, so please stop using it.

class Foo {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    void method(Object[] args) {
        // invalid: using method argument as parameter
        logger.info("Hello, {}.", args);

        // valid
        logger.info("Hello, {}.", new Object[]{ "World" });
    }
}

SLF4J_LOGGER_SHOULD_BE_PRIVATE

This pattern reports non private field whose type is org.slf4j.Logger.

class Foo {
    // invalid: field is not private
    public final Logger logger = LoggerFactory.getLogger(getClass());

    // valid
    private final Logger logger = LoggerFactory.getLogger(getClass());
}

SLF4J_LOGGER_SHOULD_BE_FINAL

This pattern reports non final field whose type is org.slf4j.Logger.

class Foo {
    // invalid: field is not final
    private Logger logger = LoggerFactory.getLogger(getClass());

    // valid
    private final Logger logger = LoggerFactory.getLogger(getClass());
}

SLF4J_LOGGER_SHOULD_BE_NON_STATIC

This pattern reports static field whose type is org.slf4j.Logger.

Sometimes using static logger is better than using non-static one. See official FAQ for detail.

If you need to use static logger, you can use PMD's default rule for logger instead.

class Foo {
    // invalid: field is static
    private static final Logger LOGGER = LoggerFactory.getLogger(Foo.class);

    // valid
    private final Logger logger = LoggerFactory.getLogger(getClass());
}

SLF4J_ILLEGAL_PASSED_CLASS

This pattern reports that illegal class is passed to LoggerFactory.getLogger(Class)

class Foo {
    // invalid: illegal class is passed to Factory
    private final Logger logger = LoggerFactory.getLogger(Bar.class);

    // valid
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final Logger logger = LoggerFactory.getLogger(Foo.class);
}

SLF4J_SIGN_ONLY_FORMAT

This pattern reports that log format which contains only sign and spaces. To make log readable, you have to use letter to explain your log.

class Foo {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    void method() {
        // invalid: bad readability
        logger.info("{}", id);

        // valid
        logger.info("{} signed in", userId);
    }
}

SLF4J_MANUALLY_PROVIDED_MESSAGE

This pattern reports needless message which is returned by Throwable#getMessage() or Throwable#getLocalizedMessage(). Normally binding will call these methods when you provide throwable instance as the last argument, so you do not have to call them manually.

class Foo {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    void method() {
        // invalid: needless 'e.getMessage()'
        logger.info("Error occured. Message is {}", e.getMessage(), e);

        // valid
        logger.info("Error occured.", e);
    }
}

How to use with Maven

To use this product, please configure your spotbugs-maven-plugin like below.

      <plugin>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-maven-plugin</artifactId>
        <version>3.1.12</version>
        <configuration>
          <plugins>
            <plugin>
              <groupId>jp.skypencil.findbugs.slf4j</groupId>
              <artifactId>bug-pattern</artifactId>
              <version>1.5.0</version>
            </plugin>
          </plugins>
        </configuration>
      </plugin>

How to use with Gradle

To use these detectors from a Gradle build, please follow the example below:

plugins {
  id "java"
  id "com.github.spotbugs" version "1.6.4"
}

repositories {
  jcenter()
}

dependencies {
  compile "org.slf4j:slf4j-api:1.7.25"
  spotbugsPlugins "jp.skypencil.findbugs.slf4j:bug-pattern:1.4.2@jar"
}

Change log

See CHANGELOG.md for detail.

Copyright and license

Copyright 2012-2020 Kengo TODA

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

findbugs-slf4j's People

Contributors

dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar kengotoda avatar punya avatar vorburger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

findbugs-slf4j's Issues

log4j2 variation

We are using log4j2 instead of slf4j and given that log4j2 meets the same standards as slf4j, I wonder what the effort would be to port it to support it?

Exception while looking for class java/lang/Thread$UncaughtExceptionHandler

Under Java 9, both findbugs and spotbugs seem to fail when running the findbugs-slf4j checks on our usage of Thread.UncaughtExceptionHandler with the following:

private static final UncaughtExceptionHandler uncaughtExceptionHandler =
    (t, e) -> LOG.error(format("Unhandled thread exception %s: %s", t.getName(), e.getMessage()), e);

The exception is:

 [java] Exception in thread "main" java.lang.AssertionError: java.lang.ClassNotFoundException: Exception while looking for class java/lang/Thread$UncaughtExceptionHandler
 [java] 	at jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector.memorizeResultOfGetClassMethod(IllegalPassedClassDetector.java:64)
 [java] 	at jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector.afterOpcode(IllegalPassedClassDetector.java:32)
 [java] 	at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:884)
 [java] 	at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:218)
 [java] 	at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:243)
 [java] 	at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:65)
 [java] 	at org.apache.bcel.classfile.Code.accept(Code.java:132)
 [java] 	at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:315)
 [java] 	at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:403)

Detect 'e.getMessage()'

Sometimes we use message to log like below, but it is not good way.

logger.warn("Error occurred. Message is:{}", e.getMessage());

It is good to use exception instance, it can log both of message and stacktrace.

logger.warn("Error occurred.", e);

We need research about which method SLF4J calls: getMessage() or getLocalizedMessage()?

Stack traces found in run

I am not sure if this is just debug info or a real problem but I am seeing these stack traces.

[INFO] Generating "FindBugs Report" report    --- findbugs-maven-plugin:2.5.2
[INFO] Locale is en
[INFO] Fork Value is true
     [java] Sep 10, 2013 7:29:49 AM java.util.prefs.WindowsPreferences <init>
     [java] WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
     [java] The following errors occurred during analysis:
     [java] Sep 10, 2013 7:30:07 AM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
     [java] SEVERE: Exception analyzing com.pjm.m2m.common.calc.RtNnlBatchCalculator using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
     [java] java.lang.IllegalArgumentException: Illegal index (-2). Please report this dump:
     [java] Code(max_stack = 3, max_locals = 10, code_length = 243)
     [java] 0:    aload_3
     [java] 1:    getstatic     com.pjm.m2m.common.model.FlowgateType.RecipCoordinatedFlowgate Lcom/pjm/m2m/common/model/FlowgateType; (71)
     [java] 4:    if_acmpeq     #9
     [java] 7:    dconst_0
     [java] 8:    dreturn
     [java] 9:    aload_0
     [java] 10:   getfield      com.pjm.m2m.common.calc.RtNnlBatchCalculator.calcAllocFlowgateSet Ljava/util/Set; (65)
     [java] 13:   lload_1
     [java] 14:   invokestatic  java.lang.Long.valueOf (J)Ljava/lang/Long; (16)
     [java] 17:   invokeinterface   java.util.Set.contains (Ljava/lang/Object;)Z (66)   2   0
     [java] 22:   ifeq      #134
     [java] 25:   aload_0
     [java] 26:   getfield      com.pjm.m2m.common.calc.RtNnlBatchCalculator.twoDayAheadAllocs Ljava/util/Map; (72)
     [java] 29:   lload_1
     [java] 30:   invokestatic  java.lang.Long.valueOf (J)Ljava/lang/Long; (16)
     [java] 33:   invokeinterface   java.util.Map.get (Ljava/lang/Object;)Ljava/lang/Object; (22)   2   0
     [java] 38:   checkcast     <com.pjm.m2m.common.model.AllocationTotals> (73)
     [java] 41:   astore        %6
     [java] 43:   aload     %6
     [java] 45:   ifnonnull     #50
     [java] 48:   dconst_0
     [java] 49:   dreturn
     [java] 50:   getstatic     com.pjm.m2m.common.model.RunType.TwoDayAhead Lcom/pjm/m2m/common/model/RunType; (74)
     [java] 53:   invokevirtual com.pjm.m2m.common.model.RunType.getCode ()I (75)
     [java] 56:   istore        %7
     [java] 58:   iload     %7
     [java] 60:   ifle      #132
     [java] 63:   iload     %7
     [java] 65:   invokestatic  com.pjm.m2m.common.model.RunType.forCode (I)Lcom/pjm/m2m/common/model/RunType; (76)
     [java] 68:   astore        %8
     [java] 70:   aload     %6
     [java] 72:   aload     %8
     [java] 74:   invokevirtual com.pjm.m2m.common.model.AllocationTotals.containsRunType (Lcom/pjm/m2m/common/model/RunType;)Z (77)
     [java] 77:   ifeq      #126
     [java] 80:   aload     %6
     [java] 82:   aload     %8
     [java] 84:   aload     %4
     [java] 86:   invokevirtual com.pjm.m2m.common.model.AllocationTotals.containsDirection (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Z (78)
     [java] 89:   ifeq      #126
     [java] 92:   aload     %6
     [java] 94:   aload     %8
     [java] 96:   aload     %4
     [java] 98:   invokevirtual com.pjm.m2m.common.model.AllocationTotals.getValues (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Lcom/pjm/m2m/common/model/ImpactValues; (79)
     [java] 101:  astore        %9
     [java] 103:  iload     %5
     [java] 105:  ifeq      #117
     [java] 108:  aload     %9
     [java] 110:  invokevirtual com.pjm.m2m.common.model.ImpactValues.getValue ()Ljava/lang/Double; (80)
     [java] 113:  invokevirtual java.lang.Double.doubleValue ()D (28)
     [java] 116:  dreturn
     [java] 117:  aload     %9
     [java] 119:  invokevirtual com.pjm.m2m.common.model.ImpactValues.getThresholdValue ()Ljava/lang/Double; (81)
     [java] 122:  invokevirtual java.lang.Double.doubleValue ()D (28)
     [java] 125:  dreturn
     [java] 126:  iinc      %7  -1
     [java] 129:  goto      #58
     [java] 132:  dconst_0
     [java] 133:  dreturn
     [java] 134:  aload_0
     [java] 135:  getfield      com.pjm.m2m.common.calc.RtNnlBatchCalculator.thirdPartyAllocs Ljava/util/Map; (82)
     [java] 138:  lload_1
     [java] 139:  invokestatic  java.lang.Long.valueOf (J)Ljava/lang/Long; (16)
     [java] 142:  invokeinterface   java.util.Map.get (Ljava/lang/Object;)Ljava/lang/Object; (22)   2   0
     [java] 147:  checkcast     <com.pjm.m2m.common.model.ThirdPartyAllocationTotals> (83)
     [java] 150:  astore        %6
     [java] 152:  aload     %6
     [java] 154:  ifnonnull     #159
     [java] 157:  dconst_0
     [java] 158:  dreturn
     [java] 159:  getstatic     com.pjm.m2m.common.model.RunType.TwoDayAhead Lcom/pjm/m2m/common/model/RunType; (74)
     [java] 162:  invokevirtual com.pjm.m2m.common.model.RunType.getCode ()I (75)
     [java] 165:  istore        %7
     [java] 167:  iload     %7
     [java] 169:  ifle      #241
     [java] 172:  iload     %7
     [java] 174:  invokestatic  com.pjm.m2m.common.model.RunType.forCode (I)Lcom/pjm/m2m/common/model/RunType; (76)
     [java] 177:  astore        %8
     [java] 179:  aload     %6
     [java] 181:  aload     %8
     [java] 183:  invokevirtual com.pjm.m2m.common.model.ThirdPartyAllocationTotals.containsRunType (Lcom/pjm/m2m/common/model/RunType;)Z (84)
     [java] 186:  ifeq      #235
     [java] 189:  aload     %6
     [java] 191:  aload     %8
     [java] 193:  aload     %4
     [java] 195:  invokevirtual com.pjm.m2m.common.model.ThirdPartyAllocationTotals.containsDirection (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Z (85)
     [java] 198:  ifeq      #235
     [java] 201:  aload     %6
     [java] 203:  aload     %8
     [java] 205:  aload     %4
     [java] 207:  invokevirtual com.pjm.m2m.common.model.ThirdPartyAllocationTotals.getValues (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Lcom/pjm/m2m/common/model/ImpactValues; (86)
     [java] 210:  astore        %9
     [java] 212:  iload     %5
     [java] 214:  ifeq      #226
     [java] 217:  aload     %9
     [java] 219:  invokevirtual com.pjm.m2m.common.model.ImpactValues.getValue ()Ljava/lang/Double; (80)
     [java] 222:  invokevirtual java.lang.Double.doubleValue ()D (28)
     [java] 225:  dreturn
     [java] 226:  aload     %9
     [java] 228:  invokevirtual com.pjm.m2m.common.model.ImpactValues.getThresholdValue ()Ljava/lang/Double; (81)
     [java] 231:  invokevirtual java.lang.Double.doubleValue ()D (28)
     [java] 234:  dreturn
     [java] 235:  iinc      %7  -1
     [java] 238:  goto      #167
     [java] 241:  dconst_0
     [java] 242:  dreturn
     [java] Attribute(s) = 
     [java] LineNumber(0, 226), LineNumber(7, 227), LineNumber(9, 231), LineNumber(25, 233), 
     [java] LineNumber(43, 235), LineNumber(48, 236), LineNumber(50, 239), LineNumber(63, 241), 
     [java] LineNumber(70, 242), LineNumber(92, 243), LineNumber(103, 244), LineNumber(108, 245), 
     [java] LineNumber(117, 247), LineNumber(126, 239), LineNumber(132, 253), LineNumber(134, 257), 
     [java] LineNumber(152, 259), LineNumber(157, 260), LineNumber(159, 263), LineNumber(172, 264), 
     [java] LineNumber(179, 265), LineNumber(201, 266), LineNumber(212, 267), LineNumber(217, 268), 
     [java] LineNumber(226, 270), LineNumber(235, 263), LineNumber(241, 275)
     [java] LocalVariable(start_pc = 103, length = 23, index = 9:com.pjm.m2m.common.model.ImpactValues impactValues)
     [java] LocalVariable(start_pc = 70, length = 56, index = 8:com.pjm.m2m.common.model.RunType runType)
     [java] LocalVariable(start_pc = 58, length = 74, index = 7:int i)
     [java] LocalVariable(start_pc = 43, length = 91, index = 6:com.pjm.m2m.common.model.AllocationTotals allocationTotals)
     [java] LocalVariable(start_pc = 212, length = 23, index = 9:com.pjm.m2m.common.model.ImpactValues impactValues)
     [java] LocalVariable(start_pc = 179, length = 56, index = 8:com.pjm.m2m.common.model.RunType runType)
     [java] LocalVariable(start_pc = 167, length = 74, index = 7:int i)
     [java] LocalVariable(start_pc = 152, length = 91, index = 6:com.pjm.m2m.common.model.ThirdPartyAllocationTotals thirdPartyTotals)
     [java] LocalVariable(start_pc = 0, length = 243, index = 0:com.pjm.m2m.common.calc.RtNnlBatchCalculator this)
     [java] LocalVariable(start_pc = 0, length = 243, index = 1:long flowgateId)
     [java] LocalVariable(start_pc = 0, length = 243, index = 3:com.pjm.m2m.common.model.FlowgateType flowgateType)
     [java] LocalVariable(start_pc = 0, length = 243, index = 4:com.pjm.m2m.common.model.FlowgateDirection direction)
     [java] LocalVariable(start_pc = 0, length = 243, index = 5:boolean use3to5PercentImpacts)
     [java] StackMapTable((SAME, offset delta=9), (APPEND 1, offset delta=40, locals={(type=Object, class=com.pjm.m2m.common.model.AllocationTotals)}), (APPEND 1, offset delta=7, locals={(type=Integer)}), (APPEND 2, offset delta=58, locals={(type=Object, class=com.pjm.m2m.common.model.RunType), (type=Object, class=com.pjm.m2m.common.model.ImpactValues)}), (CHOP 2, offset delta=8), (CHOP 1, offset delta=5), (CHOP 1, offset delta=1), (APPEND 1, offset delta=24, locals={(type=Object, class=com.pjm.m2m.common.model.ThirdPartyAllocationTotals)}), (APPEND 1, offset delta=7, locals={(type=Integer)}), (APPEND 2, offset delta=58, locals={(type=Object, class=com.pjm.m2m.common.model.RunType), (type=Object, class=com.pjm.m2m.common.model.ImpactValues)}), (CHOP 2, offset delta=8), (CHOP 1, offset delta=5))
     [java]     at jp.skypencil.findbugs.slf4j.ThrowableHandler.loadLocalVar(ThrowableHandler.java:111)
     [java]     at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:66)
     [java]     at jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
     [java]     at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
     [java]     at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
     [java]     at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
     [java]     at org.apache.bcel.classfile.Code.accept(Code.java:133)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
     [java]     at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
     [java]     at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
     [java]     at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
     [java]     at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
     [java]     at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
     [java]     at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
     [java]     at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)
     [java]   Exception analyzing com.pjm.m2m.common.calc.RtNnlBatchCalculator using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
     [java]     java.lang.IllegalArgumentException: Illegal index (-2). Please report this dump:
     [java] Code(max_stack = 3, max_locals = 10, code_length = 243)
     [java] 0:    aload_3
     [java] 1:    getstatic    com.pjm.m2m.common.model.FlowgateType.RecipCoordinatedFlowgate Lcom/pjm/m2m/common/model/FlowgateType; (71)
     [java] 4:    if_acmpeq    #9
     [java] 7:    dconst_0
     [java] 8:    dreturn
     [java] 9:    aload_0
     [java] 10:   getfield    com.pjm.m2m.common.calc.RtNnlBatchCalculator.calcAllocFlowgateSet Ljava/util/Set; (65)
     [java] 13:   lload_1
     [java] 14:   invokestatic  java.lang.Long.valueOf (J)Ljava/lang/Long; (16)
     [java] 17:   invokeinterface  java.util.Set.contains (Ljava/lang/Object;)Z (66)  2  0
     [java] 22:   ifeq    #134
     [java] 25:   aload_0
     [java] 26:   getfield    com.pjm.m2m.common.calc.RtNnlBatchCalculator.twoDayAheadAllocs Ljava/util/Map; (72)
     [java] 29:   lload_1
     [java] 30:   invokestatic  java.lang.Long.valueOf (J)Ljava/lang/Long; (16)
     [java] 33:   invokeinterface  java.util.Map.get (Ljava/lang/Object;)Ljava/lang/Object; (22)  2  0
     [java] 38:   checkcast    <com.pjm.m2m.common.model.AllocationTotals> (73)
     [java] 41:   astore    %6
     [java] 43:   aload    %6
     [java] 45:   ifnonnull    #50
     [java] 48:   dconst_0
     [java] 49:   dreturn
     [java] 50:   getstatic    com.pjm.m2m.common.model.RunType.TwoDayAhead Lcom/pjm/m2m/common/model/RunType; (74)
     [java] 53:   invokevirtual  com.pjm.m2m.common.model.RunType.getCode ()I (75)
     [java] 56:   istore    %7
     [java] 58:   iload    %7
     [java] 60:   ifle    #132
     [java] 63:   iload    %7
     [java] 65:   invokestatic  com.pjm.m2m.common.model.RunType.forCode (I)Lcom/pjm/m2m/common/model/RunType; (76)
     [java] 68:   astore    %8
     [java] 70:   aload    %6
     [java] 72:   aload    %8
     [java] 74:   invokevirtual  com.pjm.m2m.common.model.AllocationTotals.containsRunType (Lcom/pjm/m2m/common/model/RunType;)Z (77)
     [java] 77:   ifeq    #126
     [java] 80:   aload    %6
     [java] 82:   aload    %8
     [java] 84:   aload    %4
     [java] 86:   invokevirtual  com.pjm.m2m.common.model.AllocationTotals.containsDirection (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Z (78)
     [java] 89:   ifeq    #126
     [java] 92:   aload    %6
     [java] 94:   aload    %8
     [java] 96:   aload    %4
     [java] 98:   invokevirtual  com.pjm.m2m.common.model.AllocationTotals.getValues (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Lcom/pjm/m2m/common/model/ImpactValues; (79)
     [java] 101:  astore    %9
     [java] 103:  iload    %5
     [java] 105:  ifeq    #117
     [java] 108:  aload    %9
     [java] 110:  invokevirtual  com.pjm.m2m.common.model.ImpactValues.getValue ()Ljava/lang/Double; (80)
     [java] 113:  invokevirtual  java.lang.Double.doubleValue ()D (28)
     [java] 116:  dreturn
     [java] 117:  aload    %9
     [java] 119:  invokevirtual  com.pjm.m2m.common.model.ImpactValues.getThresholdValue ()Ljava/lang/Double; (81)
     [java] 122:  invokevirtual  java.lang.Double.doubleValue ()D (28)
     [java] 125:  dreturn
     [java] 126:  iinc    %7  -1
     [java] 129:  goto    #58
     [java] 132:  dconst_0
     [java] 133:  dreturn
     [java] 134:  aload_0
     [java] 135:  getfield    com.pjm.m2m.common.calc.RtNnlBatchCalculator.thirdPartyAllocs Ljava/util/Map; (82)
     [java] 138:  lload_1
     [java] 139:  invokestatic  java.lang.Long.valueOf (J)Ljava/lang/Long; (16)
     [java] 142:  invokeinterface  java.util.Map.get (Ljava/lang/Object;)Ljava/lang/Object; (22)  2  0
     [java] 147:  checkcast    <com.pjm.m2m.common.model.ThirdPartyAllocationTotals> (83)
     [java] 150:  astore    %6
     [java] 152:  aload    %6
     [java] 154:  ifnonnull    #159
     [java] 157:  dconst_0
     [java] 158:  dreturn
     [java] 159:  getstatic    com.pjm.m2m.common.model.RunType.TwoDayAhead Lcom/pjm/m2m/common/model/RunType; (74)
     [java] 162:  invokevirtual  com.pjm.m2m.common.model.RunType.getCode ()I (75)
     [java] 165:  istore    %7
     [java] 167:  iload    %7
     [java] 169:  ifle    #241
     [java] 172:  iload    %7
     [java] 174:  invokestatic  com.pjm.m2m.common.model.RunType.forCode (I)Lcom/pjm/m2m/common/model/RunType; (76)
     [java] 177:  astore    %8
     [java] 179:  aload    %6
     [java] 181:  aload    %8
     [java] 183:  invokevirtual  com.pjm.m2m.common.model.ThirdPartyAllocationTotals.containsRunType (Lcom/pjm/m2m/common/model/RunType;)Z (84)
     [java] 186:  ifeq    #235
     [java] 189:  aload    %6
     [java] 191:  aload    %8
     [java] 193:  aload    %4
     [java] 195:  invokevirtual  com.pjm.m2m.common.model.ThirdPartyAllocationTotals.containsDirection (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Z (85)
     [java] 198:  ifeq    #235
     [java] 201:  aload    %6
     [java] 203:  aload    %8
     [java] 205:  aload    %4
     [java] 207:  invokevirtual  com.pjm.m2m.common.model.ThirdPartyAllocationTotals.getValues (Lcom/pjm/m2m/common/model/RunType;Lcom/pjm/m2m/common/model/FlowgateDirection;)Lcom/pjm/m2m/common/model/ImpactValues; (86)
     [java] 210:  astore    %9
     [java] 212:  iload    %5
     [java] 214:  ifeq    #226
     [java] 217:  aload    %9
     [java] 219:  invokevirtual  com.pjm.m2m.common.model.ImpactValues.getValue ()Ljava/lang/Double; (80)
     [java] 222:  invokevirtual  java.lang.Double.doubleValue ()D (28)
     [java] 225:  dreturn
     [java] 226:  aload    %9
     [java] 228:  invokevirtual  com.pjm.m2m.common.model.ImpactValues.getThresholdValue ()Ljava/lang/Double; (81)
     [java] 231:  invokevirtual  java.lang.Double.doubleValue ()D (28)
     [java] 234:  dreturn
     [java] 235:  iinc    %7  -1
     [java] 238:  goto    #167
     [java] 241:  dconst_0
     [java] 242:  dreturn
     [java] Attribute(s) = 
     [java] LineNumber(0, 226), LineNumber(7, 227), LineNumber(9, 231), LineNumber(25, 233), 
     [java] LineNumber(43, 235), LineNumber(48, 236), LineNumber(50, 239), LineNumber(63, 241), 
     [java] LineNumber(70, 242), LineNumber(92, 243), LineNumber(103, 244), LineNumber(108, 245), 
     [java] LineNumber(117, 247), LineNumber(126, 239), LineNumber(132, 253), LineNumber(134, 257), 
     [java] LineNumber(152, 259), LineNumber(157, 260), LineNumber(159, 263), LineNumber(172, 264), 
     [java] LineNumber(179, 265), LineNumber(201, 266), LineNumber(212, 267), LineNumber(217, 268), 
     [java] LineNumber(226, 270), LineNumber(235, 263), LineNumber(241, 275)
     [java] LocalVariable(start_pc = 103, length = 23, index = 9:com.pjm.m2m.common.model.ImpactValues impactValues)
     [java] LocalVariable(start_pc = 70, length = 56, index = 8:com.pjm.m2m.common.model.RunType runType)
     [java] LocalVariable(start_pc = 58, length = 74, index = 7:int i)
     [java] LocalVariable(start_pc = 43, length = 91, index = 6:com.pjm.m2m.common.model.AllocationTotals allocationTotals)
     [java] LocalVariable(start_pc = 212, length = 23, index = 9:com.pjm.m2m.common.model.ImpactValues impactValues)
     [java] LocalVariable(start_pc = 179, length = 56, index = 8:com.pjm.m2m.common.model.RunType runType)
     [java] LocalVariable(start_pc = 167, length = 74, index = 7:int i)
     [java] LocalVariable(start_pc = 152, length = 91, index = 6:com.pjm.m2m.common.model.ThirdPartyAllocationTotals thirdPartyTotals)
     [java] LocalVariable(start_pc = 0, length = 243, index = 0:com.pjm.m2m.common.calc.RtNnlBatchCalculator this)
     [java] LocalVariable(start_pc = 0, length = 243, index = 1:long flowgateId)
     [java] LocalVariable(start_pc = 0, length = 243, index = 3:com.pjm.m2m.common.model.FlowgateType flowgateType)
     [java] LocalVariable(start_pc = 0, length = 243, index = 4:com.pjm.m2m.common.model.FlowgateDirection direction)
     [java] LocalVariable(start_pc = 0, length = 243, index = 5:boolean use3to5PercentImpacts)
     [java] StackMapTable((SAME, offset delta=9), (APPEND 1, offset delta=40, locals={(type=Object, class=com.pjm.m2m.common.model.AllocationTotals)}), (APPEND 1, offset delta=7, locals={(type=Integer)}), (APPEND 2, offset delta=58, locals={(type=Object, class=com.pjm.m2m.common.model.RunType), (type=Object, class=com.pjm.m2m.common.model.ImpactValues)}), (CHOP 2, offset delta=8), (CHOP 1, offset delta=5), (CHOP 1, offset delta=1), (APPEND 1, offset delta=24, locals={(type=Object, class=com.pjm.m2m.common.model.ThirdPartyAllocationTotals)}), (APPEND 1, offset delta=7, locals={(type=Integer)}), (APPEND 2, offset delta=58, locals={(type=Object, class=com.pjm.m2m.common.model.RunType), (type=Object, class=com.pjm.m2m.common.model.ImpactValues)}), (CHOP 2, offset delta=8), (CHOP 1, offset delta=5))
     [java]       At jp.skypencil.findbugs.slf4j.ThrowableHandler.loadLocalVar(ThrowableHandler.java:111)
     [java]       At jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:66)
     [java]       At jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
     [java]       At edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
     [java]       At edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
     [java]       At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
     [java]       At edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
     [java]       At org.apache.bcel.classfile.Code.accept(Code.java:133)
     [java]       At edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
     [java]       At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
     [java]       At org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
     [java]       At edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
     [java]       At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
     [java]       At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
     [java]       At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
     [java]       At edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
     [java]       At edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)
     [java] Warnings generated: 5

Exception when logging array class

The following code
logger.info("log a class of an array {}", int[].class);

Will generated the following exception
Exception in thread "main" java.lang.AssertionError: java.lang.ClassNotFoundException: Exception while looking for class [B
at jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector.afterOpcode(IllegalPassedClassDetector.java:35)
at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
at org.apache.bcel.classfile.Code.accept(Code.java:133)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)
Caused by: java.lang.ClassNotFoundException: Exception while looking for class [B
at edu.umd.cs.findbugs.AnalysisCacheToRepositoryAdapter.loadClass(AnalysisCacheToRepositoryAdapter.java:89)
at org.apache.bcel.Repository.lookupClass(Repository.java:63)
at jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector.afterOpcode(IllegalPassedClassDetector.java:33)
... 14 more
Caused by: edu.umd.cs.findbugs.classfile.MissingClassException: Resource not found: [B.class
at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:61)
at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:42)
at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:266)
at edu.umd.cs.findbugs.classfile.engine.ClassInfoAnalysisEngine.analyze(ClassInfoAnalysisEngine.java:59)
at edu.umd.cs.findbugs.classfile.engine.ClassInfoAnalysisEngine.analyze(ClassInfoAnalysisEngine.java:38)
at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:266)
at edu.umd.cs.findbugs.ba.XFactory.getXClass(XFactory.java:652)
at edu.umd.cs.findbugs.ba.ch.Subtypes2.isSubtype0(Subtypes2.java:436)
at edu.umd.cs.findbugs.ba.ch.Subtypes2.isSubtype(Subtypes2.java:396)
at edu.umd.cs.findbugs.detect.StaticCalendarDetector.visit(StaticCalendarDetector.java:148)
at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitConstantPool(BetterVisitor.java:262)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitConstantPool(PreorderVisitor.java:246)
at org.apache.bcel.classfile.ConstantPool.accept(ConstantPool.java:92)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:349)
... 7 more
Caused by: edu.umd.cs.findbugs.classfile.ResourceNotFoundException: Resource not found: [B.class
at edu.umd.cs.findbugs.classfile.impl.ClassPathImpl.lookupResource(ClassPathImpl.java:158)
at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:59)
... 20 more

Looks like IllegalPassedClassDetector.afterOpcode's call to lookupClass does not know how to handle this class name.

If you know the solution great, otherwise let me know and I can research into this some more to find the proper fix.

Upgrade mockito-all

Now mockito released new version. And we may try to use mockito-core instead.

Redesign priority and category

Currently all bug instance has same priority. We need to modify rules.xml and each Java class to make this plugin useful.

And, we have to redesign category too.

SLF4J_MANUALLY_PROVIDED_MESSAGE should be ignored for TRACE and DEBUG

In certain scenarios we want to log a DEBUG of just the localized message and not the full stack trace...

  } catch (BusinessException e) {
     final String localizedMessage = e.getLocalizedMessage();
     LOG.debug("Reporting BusinessException for method {}: {}", new Object[] { methodName, localizedMessage });

We are getting the SLF4J_MANUALLY_PROVIDED_MESSAGE error. Maybe that should only be for INFO and higher or WARN and higher?

New rule: format should contain non-sign to explain situation

In many cases, these logs are wrong:

logger.info("{}", id);
logger.info("{},{}", foo, bar);

because log file cannot be readable. It should be like below:

logger.info("{} is signed in", id);
logger.info("{}が{}を削除しました。", user, item);

Can't get stack offset 0 from []

[INFO] Fork Value is true
     [java] append
     [java] java.lang.StringBuilder.append(I)Ljava/lang/StringBuilder;
     [java] append
     [java] java.lang.StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
     [java] append
     [java] java.lang.StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
     [java] append
     [java] java.lang.StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
     [java] toString
     [java] java.lang.StringBuilder.toString()Ljava/lang/String;
     [java] println
     [java] java.io.PrintStream.println(Ljava/lang/String;)V
     [java] println
     [java] java.io.PrintStream.println(Ljava/lang/Object;)V
     [java] println
     [java] java.io.PrintStream.println(Ljava/lang/Object;)V
     [java] println
     [java] java.io.PrintStream.println(Ljava/lang/Object;)V
     [java] The following errors occurred during analysis:
     [java] Dec 05, 2013 11:29:12 PM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
     [java] SEVERE: Can't get stack offset 0 from [] @ 81 in o.u.s.StringSetSorter.main : ([Ljava.lang.String;)V
     [java] java.lang.IllegalArgumentException: 0 is not a value stack offset
     [java]     at edu.umd.cs.findbugs.OpcodeStack.getStackItem(OpcodeStack.java:2741)
     [java]     at jp.skypencil.findbugs.slf4j.parameter.ArrayDataHandler.tryToDetectArraySize(ArrayDataHandler.java:53)
     [java]     at jp.skypencil.findbugs.slf4j.parameter.ArrayDataHandler.afterOpcode(ArrayDataHandler.java:36)
     [java]     at jp.skypencil.findbugs.slf4j.parameter.AbstractDetectorForParameterArray.afterOpcode(AbstractDetectorForParameterArray.java:151)
     [java]     at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
     [java]     at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
     [java]     at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:62)
     [java]     at org.apache.bcel.classfile.Code.accept(Code.java:133)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:289)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:369)
     [java]     at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
     [java]     at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
     [java]     at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
     [java]     at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1190)
     [java]     at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:278)
     [java]     at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
     [java]     at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1298)

RFE: SLF4J_ONLY

In a large project, it can be useful to enforce that everyone is actually using slf4j and not (directly) log4j (v1/v2) or JUL etc.

A new detector checking that any field / import of a type with simple name Logger must be the org.slf4j.Logger can help with this. This is, of course, "just" a kind of "heuristic", but because in e.g. Log4j and JUL and even other project specific logging frameworks (think e.g. io.vertx.core.logging.Logger and what not), such utilities typically are actually named Logger as well, this works quite well in practice.

FYI https://github.com/opendaylight/yangtools/blob/master/common/checkstyle-logging/src/main/java/org/opendaylight/yangtools/checkstyle/LoggerMustBeSlf4jCheck.java

Documentation - spotbugs:gui does not work with spotbugs-maven-plugin less than 3.1.0-RC8

mvn spotbugs:gui throws the below error while running with 3.1.0-RC7

Failed to execute goal com.github.spotbugs:spotbugs-maven-plugin:3.1.0-RC7:gui (default-cli) on project reg-common: Execution default-cli of goal com.github.spotbugs:spotbugs-maven-plugin:3.1.0-RC7:gui failed: java doesn't support the nested "getThresholdParameter" element.: The <java> type doesn't support the nested "getThresholdParameter" element. -> [Help 1]

Things work fine with 3.1.0-RC8. Can we update the README and doc to include this point?

<build>
...
    <plugin>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-maven-plugin</artifactId>
        <version>3.1.0-RC8</version>
        <configuration>
            <plugins>
                <plugin>
                    <groupId>jp.skypencil.findbugs.slf4j</groupId>
                    <artifactId>bug-pattern</artifactId>
                    <version>1.2.4</version>
                </plugin>
            </plugins>
            <includeFilterFile>./spotbugIncludeFilter.xml</includeFilterFile>
        </configuration>
    </plugin>
</build>

Not detecting problems

I'm not sure why it is not detecting problems. Is there more config needed than I have?
I wrote this to test it, but no failure occurs:

private final Logger log = LoggerFactory.getLogger(TheClass.class);
...
    final RuntimeException ex = new RuntimeException();
    final Integer num = 4;
    final String str = "fred";
    log.debug(str + " barney={}, {}, {}, {}", num, ex);

I see via debug info that the plugin is loaded:

 [java] Loading jp.skypencil.findbugs.slf4j
 [java] Registering detector: jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
...
 [java] Adding plugin jp.skypencil.findbugs.slf4j to execution plan

and FB finds the class with the above snippet, so it should process it.

I only see WrongPlaceholderDetector mentioned in the output, no other skypencil detectors:

[java] Applying jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector to (class name)

Here is the POM config:

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>findbugs-maven-plugin</artifactId>
      <version>${findbugsPluginVersion}</version>
      <dependencies>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>codingauditrules</artifactId>
          <version>${project.version}</version>
        </dependency>
      </dependencies>
      <configuration>
        <effort>Max</effort>
        <threshold>Low</threshold>
        <xmlOutput>true</xmlOutput>
        <excludeFilterFile>findbugs/findbugs-exclude-filters.xml</excludeFilterFile>
        <plugins>
          <plugin>
            <groupId>jp.skypencil.findbugs.slf4j</groupId>
            <artifactId>bug-pattern</artifactId>
            <version>${findbugsSlf4jRulesetVersion}</version>
          </plugin>
        </plugins>
      </configuration>
    </plugin>

The excludeFilterFile contents does not affect this class.

Hoping you have suggestions!

WrongPlaceholderDetector - IllegalArgumentException: Illegal index (-31)

Oct 02, 2013 9:51:03 AM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
SEVERE: Exception analyzing ool.manager.shop.transaction.DefaultTransactionEngine using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
java.lang.IllegalArgumentException: Illegal index (-31). Please report this dump:
Code(max_stack = 4, max_locals = 16, code_length = 489)
0: aload_0
1: invokespecial ool.manager.shop.transaction.DefaultTransactionEngine.getScoreCache ()Lnet/sf/ehcache/Ehcache; (16)
4: astore_2
5: aload_0
6: aload_1
7: invokespecial ool.manager.shop.transaction.DefaultTransactionEngine.getSortedKeys ([Lool/manager/shop/transaction/DefaultTransactionEngine$TransactionOperation;)[Ljava/lang/String; (17)
10: astore_3
11: new <java.util.ArrayList> (18)
14: dup
15: aload_1
16: arraylength
17: invokespecial java.util.ArrayList. (I)V (19)
20: astore %4
22: aload_3
23: astore %5
25: aload %5
27: arraylength
28: istore %6
30: iconst_0
31: istore %7
33: iload %7
35: iload %6
37: if_icmpge #134
40: aload %5
42: iload %7
44: aaload
45: astore %8
47: aload_2
48: aload %8
50: invokeinterface net.sf.ehcache.Ehcache.isWriteLockedByCurrentThread (Ljava/lang/Object;)Z (20) 2 0
55: ifeq #86
58: new <java.lang.IllegalStateException> (21)
61: dup
62: new <java.lang.StringBuilder> (22)
65: dup
66: invokespecial java.lang.StringBuilder. ()V (23)
69: ldc "Toto vlakno jiz drzi zamek pro klic " (24)
71: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
74: aload %8
76: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
79: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (26)
82: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;)V (27)
85: athrow
86: aload_2
87: aload %8
89: ldc2_w 5000 (28)
92: invokeinterface net.sf.ehcache.Ehcache.tryWriteLockOnKey (Ljava/lang/Object;J)Z (30) 4 0
97: ifne #128
100: new <java.lang.IllegalStateException> (21)
103: dup
104: new <java.lang.StringBuilder> (22)
107: dup
108: invokespecial java.lang.StringBuilder. ()V (23)
111: ldc "Nepodarilo se ziskat zamek pro klic " (31)
113: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
116: aload %8
118: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
121: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (26)
124: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;)V (27)
127: athrow
128: iinc %7 1
131: goto #33
134: aload_0
135: getfield ool.manager.shop.transaction.DefaultTransactionEngine.transactionManager Lorg/springframework/orm/hibernate3/HibernateTransactionManager; (32)
138: getstatic ool.manager.shop.transaction.DefaultTransactionEngine.DB_TRANSACTION_DEFINITION Lorg/springframework/transaction/TransactionDefinition; (33)
141: invokevirtual org.springframework.orm.hibernate3.HibernateTransactionManager.getTransaction (Lorg/springframework/transaction/TransactionDefinition;)Lorg/springframework/transaction/TransactionStatus; (34)
144: astore %5
146: aload_1
147: astore %6
149: aload %6
151: arraylength
152: istore %7
154: iconst_0
155: istore %8
157: iload %8
159: iload %7
161: if_icmpge #250
164: aload %6
166: iload %8
168: aaload
169: astore %9
171: aload %9
173: invokevirtual ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation.implementation ()Lool/manager/shop/transaction/Transaction; (35)
176: astore %10
178: aload %4
180: aload %10
182: invokeinterface java.util.List.add (Ljava/lang/Object;)Z (36) 2 0
187: pop
188: aload_1
189: arraylength
190: iconst_1
191: if_icmple #244
194: aload %10
196: invokevirtual ool.manager.shop.transaction.Transaction.getState ()Lool/model/erp/TransactionState; (37)
199: getstatic ool.model.erp.TransactionState.EXECUTED Lool/model/erp/TransactionState; (38)
202: if_acmpeq #244
205: aload %10
207: invokevirtual ool.manager.shop.transaction.Transaction.getState ()Lool/model/erp/TransactionState; (37)
210: getstatic ool.model.erp.TransactionState.COMPLETED Lool/model/erp/TransactionState; (39)
213: if_acmpeq #244
216: new <java.lang.IllegalStateException> (21)
219: dup
220: new <java.lang.StringBuilder> (22)
223: dup
224: invokespecial java.lang.StringBuilder. ()V (23)
227: ldc "Jedna transakce z mnoziny atomicky vykonavanych transakci nebyla uspesne ukoncena: " (40)
229: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
232: aload %10
234: invokevirtual java.lang.StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder; (41)
237: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (26)
240: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;)V (27)
243: athrow
244: iinc %8 1
247: goto #157
250: goto #292
253: astore %6
255: aload_0
256: getfield ool.manager.shop.transaction.DefaultTransactionEngine.logger Lorg/slf4j/Logger; (43)
259: ldc "Error doInTransactionAndSynchronized: {}" (44)
261: aload %6
263: invokevirtual java.lang.RuntimeException.getMessage ()Ljava/lang/String; (45)
266: aload %6
268: invokeinterface org.slf4j.Logger.error (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V (46) 4 0
273: aload_0
274: getfield ool.manager.shop.transaction.DefaultTransactionEngine.transactionManager Lorg/springframework/orm/hibernate3/HibernateTransactionManager; (32)
277: aload %5
279: invokevirtual org.springframework.orm.hibernate3.HibernateTransactionManager.rollback (Lorg/springframework/transaction/TransactionStatus;)V (47)
282: new <java.lang.IllegalStateException> (21)
285: dup
286: aload %6
288: invokespecial java.lang.IllegalStateException. (Ljava/lang/Throwable;)V (48)
291: athrow
292: aload_0
293: getfield ool.manager.shop.transaction.DefaultTransactionEngine.transactionManager Lorg/springframework/orm/hibernate3/HibernateTransactionManager; (32)
296: aload %5
298: invokevirtual org.springframework.orm.hibernate3.HibernateTransactionManager.commit (Lorg/springframework/transaction/TransactionStatus;)V (49)
301: goto #334
304: astore %6
306: aload_0
307: getfield ool.manager.shop.transaction.DefaultTransactionEngine.logger Lorg/slf4j/Logger; (43)
310: ldc "Error commiting: {}" (50)
312: aload %6
314: invokevirtual java.lang.RuntimeException.getMessage ()Ljava/lang/String; (45)
317: aload %6
319: invokeinterface org.slf4j.Logger.error (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V (46) 4 0
324: new <java.lang.IllegalStateException> (21)
327: dup
328: aload %6
330: invokespecial java.lang.IllegalStateException. (Ljava/lang/Throwable;)V (48)
333: athrow
334: aload_3
335: astore %5
337: aload %5
339: arraylength
340: istore %6
342: iconst_0
343: istore %7
345: iload %7
347: iload %6
349: if_icmpge #384
352: aload %5
354: iload %7
356: aaload
357: astore %8
359: aload_2
360: aload %8
362: invokeinterface net.sf.ehcache.Ehcache.isWriteLockedByCurrentThread (Ljava/lang/Object;)Z (20) 2 0
367: ifeq #378
370: aload_2
371: aload %8
373: invokeinterface net.sf.ehcache.Ehcache.releaseWriteLockOnKey (Ljava/lang/Object;)V (51) 2 0
378: iinc %7 1
381: goto #345
384: goto #468
387: astore %5
389: new <java.lang.IllegalStateException> (21)
392: dup
393: ldc "Nepodarilo se ziskat zamek" (53)
395: aload %5
397: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;Ljava/lang/Throwable;)V (54)
400: athrow
401: astore %5
403: new <java.lang.IllegalStateException> (21)
406: dup
407: aload %5
409: invokespecial java.lang.IllegalStateException. (Ljava/lang/Throwable;)V (48)
412: athrow
413: astore %11
415: aload_3
416: astore %12
418: aload %12
420: arraylength
421: istore %13
423: iconst_0
424: istore %14
426: iload %14
428: iload %13
430: if_icmpge #465
433: aload %12
435: iload %14
437: aaload
438: astore %15
440: aload_2
441: aload %15
443: invokeinterface net.sf.ehcache.Ehcache.isWriteLockedByCurrentThread (Ljava/lang/Object;)Z (20) 2 0
448: ifeq #459
451: aload_2
452: aload %15
454: invokeinterface net.sf.ehcache.Ehcache.releaseWriteLockOnKey (Ljava/lang/Object;)V (51) 2 0
459: iinc %14 1
462: goto #426
465: aload %11
467: athrow
468: aload %4
470: aload %4
472: invokeinterface java.util.List.size ()I (55) 1 0
477: anewarray <ool.manager.shop.transaction.Transaction> (56)
480: invokeinterface java.util.List.toArray ([Ljava/lang/Object;)[Ljava/lang/Object; (57) 2 0
485: checkcast <[Lool.manager.shop.transaction.Transaction;> (58)
488: areturn

Exception handler(s) =
From To Handler Type
146 250 253 java.lang.RuntimeException(42)
292 301 304 java.lang.RuntimeException(42)
22 334 387 java.lang.InterruptedException(52)
22 334 401 java.lang.RuntimeException(42)
22 334 413 (0)
387 415 413 (0)

Attribute(s) =
LineNumber(0, 117), LineNumber(5, 119), LineNumber(11, 121), LineNumber(22, 124),
LineNumber(47, 125), LineNumber(58, 126), LineNumber(86, 127), LineNumber(100, 128),
LineNumber(128, 124), LineNumber(134, 132), LineNumber(146, 135), LineNumber(171, 137),
LineNumber(178, 138), LineNumber(188, 143), LineNumber(216, 147), LineNumber(244, 135),
LineNumber(250, 160), LineNumber(253, 153), LineNumber(255, 154), LineNumber(273, 156),
LineNumber(282, 159), LineNumber(292, 163), LineNumber(301, 169), LineNumber(304, 164),
LineNumber(306, 165), LineNumber(324, 168), LineNumber(334, 176), LineNumber(359, 177),
LineNumber(370, 178), LineNumber(378, 176), LineNumber(384, 181), LineNumber(387, 170),
LineNumber(389, 171), LineNumber(401, 172), LineNumber(403, 173), LineNumber(413, 176),
LineNumber(440, 177), LineNumber(451, 178), LineNumber(459, 176), LineNumber(468, 182)

LocalVariable(start_pc = 47, length = 81, index = 8:String key)
LocalVariable(start_pc = 25, length = 109, index = 5:String[] arr$)
LocalVariable(start_pc = 30, length = 104, index = 6:int len$)
LocalVariable(start_pc = 33, length = 101, index = 7:int i$)
LocalVariable(start_pc = 178, length = 66, index = 10:ool.manager.shop.transaction.Transaction transaction)
LocalVariable(start_pc = 171, length = 73, index = 9:ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation transactionOperation)
LocalVariable(start_pc = 149, length = 101, index = 6:ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation[] arr$)
LocalVariable(start_pc = 154, length = 96, index = 7:int len$)
LocalVariable(start_pc = 157, length = 93, index = 8:int i$)
LocalVariable(start_pc = 255, length = 37, index = 6:RuntimeException e)
LocalVariable(start_pc = 306, length = 28, index = 6:RuntimeException e)
LocalVariable(start_pc = 146, length = 188, index = 5:org.springframework.transaction.TransactionStatus status)
LocalVariable(start_pc = 359, length = 19, index = 8:String key)
LocalVariable(start_pc = 337, length = 47, index = 5:String[] arr$)
LocalVariable(start_pc = 342, length = 42, index = 6:int len$)
LocalVariable(start_pc = 345, length = 39, index = 7:int i$)
LocalVariable(start_pc = 389, length = 12, index = 5:InterruptedException e)
LocalVariable(start_pc = 403, length = 10, index = 5:RuntimeException e)
LocalVariable(start_pc = 440, length = 19, index = 15:String key)
LocalVariable(start_pc = 418, length = 47, index = 12:String[] arr$)
LocalVariable(start_pc = 423, length = 42, index = 13:int len$)
LocalVariable(start_pc = 426, length = 39, index = 14:int i$)
LocalVariable(start_pc = 0, length = 489, index = 0:ool.manager.shop.transaction.DefaultTransactionEngine this)
LocalVariable(start_pc = 0, length = 489, index = 1:ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation[] transactionOperations)
LocalVariable(start_pc = 5, length = 484, index = 2:net.sf.ehcache.Ehcache cache)
LocalVariable(start_pc = 11, length = 478, index = 3:String[] keys)
LocalVariable(start_pc = 22, length = 467, index = 4:java.util.List result)
LocalVariable(start_pc = 22, length = 467, index = 4:java.util.List<Lool.manager.shop.transaction.Transaction result)
StackMapTable((FULL, offset delta=33, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List), (type=Object, class=[Ljava.lang.String;), (type=Integer), (type=Integer)}), (APPEND 1, offset delta=52, locals={(type=Object, class=java.lang.String)}), (CHOP 1, offset delta=41), (CHOP 3, offset delta=5), (FULL, offset delta=22, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List), (type=Object, class=org.springframework.transaction.TransactionStatus), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Integer), (type=Integer)}), (SAME_EXTENDED, offset delta=86), (CHOP 3, offset delta=5), (SAME_LOCALS_1_STACK, offset delta=2, stack items={(type=Object, class=java.lang.RuntimeException)}), (SAME, offset delta=38), (SAME_LOCALS_1_STACK, offset delta=11, stack items={(type=Object, class=java.lang.RuntimeException)}), (CHOP 1, offset delta=29), (APPEND 3, offset delta=10, locals={(type=Object, class=[Ljava.lang.String;), (type=Integer), (type=Integer)}), (SAME, offset delta=32), (CHOP 3, offset delta=5), (SAME_LOCALS_1_STACK, offset delta=2, stack items={(type=Object, class=java.lang.InterruptedException)}), (SAME_LOCALS_1_STACK, offset delta=13, stack items={(type=Object, class=java.lang.RuntimeException)}), (SAME_LOCALS_1_STACK, offset delta=11, stack items={(type=Object, class=java.lang.Throwable)}), (FULL, offset delta=12, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List), (type=Bogus), (type=Bogus), (type=Bogus), (type=Bogus), (type=Bogus), (type=Bogus), (type=Object, class=java.lang.Throwable), (type=Object, class=[Ljava.lang.String;), (type=Integer), (type=Integer)}), (SAME, offset delta=32), (CHOP 3, offset delta=5), (FULL, offset delta=2, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List)}))

at jp.skypencil.findbugs.slf4j.ThrowableHandler.loadLocalVar(ThrowableHandler.java:111)
at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:66)
at jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
at org.apache.bcel.classfile.Code.accept(Code.java:133)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
at org.sonar.plugins.findbugs.FindbugsExecutor$FindbugsTask.call(FindbugsExecutor.java:199)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

Exception analyzing ool.manager.shop.transaction.DefaultTransactionEngine using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
java.lang.IllegalArgumentException: Illegal index (-31). Please report this dump:
Code(max_stack = 4, max_locals = 16, code_length = 489)
0: aload_0
1: invokespecial ool.manager.shop.transaction.DefaultTransactionEngine.getScoreCache ()Lnet/sf/ehcache/Ehcache; (16)
4: astore_2
5: aload_0
6: aload_1
7: invokespecial ool.manager.shop.transaction.DefaultTransactionEngine.getSortedKeys ([Lool/manager/shop/transaction/DefaultTransactionEngine$TransactionOperation;)[Ljava/lang/String; (17)
10: astore_3
11: new <java.util.ArrayList> (18)
14: dup
15: aload_1
16: arraylength
17: invokespecial java.util.ArrayList. (I)V (19)
20: astore %4
22: aload_3
23: astore %5
25: aload %5
27: arraylength
28: istore %6
30: iconst_0
31: istore %7
33: iload %7
35: iload %6
37: if_icmpge #134
40: aload %5
42: iload %7
44: aaload
45: astore %8
47: aload_2
48: aload %8
50: invokeinterface net.sf.ehcache.Ehcache.isWriteLockedByCurrentThread (Ljava/lang/Object;)Z (20) 2 0
55: ifeq #86
58: new <java.lang.IllegalStateException> (21)
61: dup
62: new <java.lang.StringBuilder> (22)
65: dup
66: invokespecial java.lang.StringBuilder. ()V (23)
69: ldc "Toto vlakno jiz drzi zamek pro klic " (24)
71: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
74: aload %8
76: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
79: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (26)
82: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;)V (27)
85: athrow
86: aload_2
87: aload %8
89: ldc2_w 5000 (28)
92: invokeinterface net.sf.ehcache.Ehcache.tryWriteLockOnKey (Ljava/lang/Object;J)Z (30) 4 0
97: ifne #128
100: new <java.lang.IllegalStateException> (21)
103: dup
104: new <java.lang.StringBuilder> (22)
107: dup
108: invokespecial java.lang.StringBuilder. ()V (23)
111: ldc "Nepodarilo se ziskat zamek pro klic " (31)
113: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
116: aload %8
118: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
121: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (26)
124: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;)V (27)
127: athrow
128: iinc %7 1
131: goto #33
134: aload_0
135: getfield ool.manager.shop.transaction.DefaultTransactionEngine.transactionManager Lorg/springframework/orm/hibernate3/HibernateTransactionManager; (32)
138: getstatic ool.manager.shop.transaction.DefaultTransactionEngine.DB_TRANSACTION_DEFINITION Lorg/springframework/transaction/TransactionDefinition; (33)
141: invokevirtual org.springframework.orm.hibernate3.HibernateTransactionManager.getTransaction (Lorg/springframework/transaction/TransactionDefinition;)Lorg/springframework/transaction/TransactionStatus; (34)
144: astore %5
146: aload_1
147: astore %6
149: aload %6
151: arraylength
152: istore %7
154: iconst_0
155: istore %8
157: iload %8
159: iload %7
161: if_icmpge #250
164: aload %6
166: iload %8
168: aaload
169: astore %9
171: aload %9
173: invokevirtual ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation.implementation ()Lool/manager/shop/transaction/Transaction; (35)
176: astore %10
178: aload %4
180: aload %10
182: invokeinterface java.util.List.add (Ljava/lang/Object;)Z (36) 2 0
187: pop
188: aload_1
189: arraylength
190: iconst_1
191: if_icmple #244
194: aload %10
196: invokevirtual ool.manager.shop.transaction.Transaction.getState ()Lool/model/erp/TransactionState; (37)
199: getstatic ool.model.erp.TransactionState.EXECUTED Lool/model/erp/TransactionState; (38)
202: if_acmpeq #244
205: aload %10
207: invokevirtual ool.manager.shop.transaction.Transaction.getState ()Lool/model/erp/TransactionState; (37)
210: getstatic ool.model.erp.TransactionState.COMPLETED Lool/model/erp/TransactionState; (39)
213: if_acmpeq #244
216: new <java.lang.IllegalStateException> (21)
219: dup
220: new <java.lang.StringBuilder> (22)
223: dup
224: invokespecial java.lang.StringBuilder. ()V (23)
227: ldc "Jedna transakce z mnoziny atomicky vykonavanych transakci nebyla uspesne ukoncena: " (40)
229: invokevirtual java.lang.StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; (25)
232: aload %10
234: invokevirtual java.lang.StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder; (41)
237: invokevirtual java.lang.StringBuilder.toString ()Ljava/lang/String; (26)
240: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;)V (27)
243: athrow
244: iinc %8 1
247: goto #157
250: goto #292
253: astore %6
255: aload_0
256: getfield ool.manager.shop.transaction.DefaultTransactionEngine.logger Lorg/slf4j/Logger; (43)
259: ldc "Error doInTransactionAndSynchronized: {}" (44)
261: aload %6
263: invokevirtual java.lang.RuntimeException.getMessage ()Ljava/lang/String; (45)
266: aload %6
268: invokeinterface org.slf4j.Logger.error (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V (46) 4 0
273: aload_0
274: getfield ool.manager.shop.transaction.DefaultTransactionEngine.transactionManager Lorg/springframework/orm/hibernate3/HibernateTransactionManager; (32)
277: aload %5
279: invokevirtual org.springframework.orm.hibernate3.HibernateTransactionManager.rollback (Lorg/springframework/transaction/TransactionStatus;)V (47)
282: new <java.lang.IllegalStateException> (21)
285: dup
286: aload %6
288: invokespecial java.lang.IllegalStateException. (Ljava/lang/Throwable;)V (48)
291: athrow
292: aload_0
293: getfield ool.manager.shop.transaction.DefaultTransactionEngine.transactionManager Lorg/springframework/orm/hibernate3/HibernateTransactionManager; (32)
296: aload %5
298: invokevirtual org.springframework.orm.hibernate3.HibernateTransactionManager.commit (Lorg/springframework/transaction/TransactionStatus;)V (49)
301: goto #334
304: astore %6
306: aload_0
307: getfield ool.manager.shop.transaction.DefaultTransactionEngine.logger Lorg/slf4j/Logger; (43)
310: ldc "Error commiting: {}" (50)
312: aload %6
314: invokevirtual java.lang.RuntimeException.getMessage ()Ljava/lang/String; (45)
317: aload %6
319: invokeinterface org.slf4j.Logger.error (Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V (46) 4 0
324: new <java.lang.IllegalStateException> (21)
327: dup
328: aload %6
330: invokespecial java.lang.IllegalStateException. (Ljava/lang/Throwable;)V (48)
333: athrow
334: aload_3
335: astore %5
337: aload %5
339: arraylength
340: istore %6
342: iconst_0
343: istore %7
345: iload %7
347: iload %6
349: if_icmpge #384
352: aload %5
354: iload %7
356: aaload
357: astore %8
359: aload_2
360: aload %8
362: invokeinterface net.sf.ehcache.Ehcache.isWriteLockedByCurrentThread (Ljava/lang/Object;)Z (20) 2 0
367: ifeq #378
370: aload_2
371: aload %8
373: invokeinterface net.sf.ehcache.Ehcache.releaseWriteLockOnKey (Ljava/lang/Object;)V (51) 2 0
378: iinc %7 1
381: goto #345
384: goto #468
387: astore %5
389: new <java.lang.IllegalStateException> (21)
392: dup
393: ldc "Nepodarilo se ziskat zamek" (53)
395: aload %5
397: invokespecial java.lang.IllegalStateException. (Ljava/lang/String;Ljava/lang/Throwable;)V (54)
400: athrow
401: astore %5
403: new <java.lang.IllegalStateException> (21)
406: dup
407: aload %5
409: invokespecial java.lang.IllegalStateException. (Ljava/lang/Throwable;)V (48)
412: athrow
413: astore %11
415: aload_3
416: astore %12
418: aload %12
420: arraylength
421: istore %13
423: iconst_0
424: istore %14
426: iload %14
428: iload %13
430: if_icmpge #465
433: aload %12
435: iload %14
437: aaload
438: astore %15
440: aload_2
441: aload %15
443: invokeinterface net.sf.ehcache.Ehcache.isWriteLockedByCurrentThread (Ljava/lang/Object;)Z (20) 2 0
448: ifeq #459
451: aload_2
452: aload %15
454: invokeinterface net.sf.ehcache.Ehcache.releaseWriteLockOnKey (Ljava/lang/Object;)V (51) 2 0
459: iinc %14 1
462: goto #426
465: aload %11
467: athrow
468: aload %4
470: aload %4
472: invokeinterface java.util.List.size ()I (55) 1 0
477: anewarray <ool.manager.shop.transaction.Transaction> (56)
480: invokeinterface java.util.List.toArray ([Ljava/lang/Object;)[Ljava/lang/Object; (57) 2 0
485: checkcast <[Lool.manager.shop.transaction.Transaction;> (58)
488: areturn

Exception handler(s) =
From To Handler Type
146 250 253 java.lang.RuntimeException(42)
292 301 304 java.lang.RuntimeException(42)
22 334 387 java.lang.InterruptedException(52)
22 334 401 java.lang.RuntimeException(42)
22 334 413 (0)
387 415 413 (0)

Attribute(s) =
LineNumber(0, 117), LineNumber(5, 119), LineNumber(11, 121), LineNumber(22, 124),
LineNumber(47, 125), LineNumber(58, 126), LineNumber(86, 127), LineNumber(100, 128),
LineNumber(128, 124), LineNumber(134, 132), LineNumber(146, 135), LineNumber(171, 137),
LineNumber(178, 138), LineNumber(188, 143), LineNumber(216, 147), LineNumber(244, 135),
LineNumber(250, 160), LineNumber(253, 153), LineNumber(255, 154), LineNumber(273, 156),
LineNumber(282, 159), LineNumber(292, 163), LineNumber(301, 169), LineNumber(304, 164),
LineNumber(306, 165), LineNumber(324, 168), LineNumber(334, 176), LineNumber(359, 177),
LineNumber(370, 178), LineNumber(378, 176), LineNumber(384, 181), LineNumber(387, 170),
LineNumber(389, 171), LineNumber(401, 172), LineNumber(403, 173), LineNumber(413, 176),
LineNumber(440, 177), LineNumber(451, 178), LineNumber(459, 176), LineNumber(468, 182)

LocalVariable(start_pc = 47, length = 81, index = 8:String key)
LocalVariable(start_pc = 25, length = 109, index = 5:String[] arr$)
LocalVariable(start_pc = 30, length = 104, index = 6:int len$)
LocalVariable(start_pc = 33, length = 101, index = 7:int i$)
LocalVariable(start_pc = 178, length = 66, index = 10:ool.manager.shop.transaction.Transaction transaction)
LocalVariable(start_pc = 171, length = 73, index = 9:ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation transactionOperation)
LocalVariable(start_pc = 149, length = 101, index = 6:ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation[] arr$)
LocalVariable(start_pc = 154, length = 96, index = 7:int len$)
LocalVariable(start_pc = 157, length = 93, index = 8:int i$)
LocalVariable(start_pc = 255, length = 37, index = 6:RuntimeException e)
LocalVariable(start_pc = 306, length = 28, index = 6:RuntimeException e)
LocalVariable(start_pc = 146, length = 188, index = 5:org.springframework.transaction.TransactionStatus status)
LocalVariable(start_pc = 359, length = 19, index = 8:String key)
LocalVariable(start_pc = 337, length = 47, index = 5:String[] arr$)
LocalVariable(start_pc = 342, length = 42, index = 6:int len$)
LocalVariable(start_pc = 345, length = 39, index = 7:int i$)
LocalVariable(start_pc = 389, length = 12, index = 5:InterruptedException e)
LocalVariable(start_pc = 403, length = 10, index = 5:RuntimeException e)
LocalVariable(start_pc = 440, length = 19, index = 15:String key)
LocalVariable(start_pc = 418, length = 47, index = 12:String[] arr$)
LocalVariable(start_pc = 423, length = 42, index = 13:int len$)
LocalVariable(start_pc = 426, length = 39, index = 14:int i$)
LocalVariable(start_pc = 0, length = 489, index = 0:ool.manager.shop.transaction.DefaultTransactionEngine this)
LocalVariable(start_pc = 0, length = 489, index = 1:ool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation[] transactionOperations)
LocalVariable(start_pc = 5, length = 484, index = 2:net.sf.ehcache.Ehcache cache)
LocalVariable(start_pc = 11, length = 478, index = 3:String[] keys)
LocalVariable(start_pc = 22, length = 467, index = 4:java.util.List result)
LocalVariable(start_pc = 22, length = 467, index = 4:java.util.List<Lool.manager.shop.transaction.Transaction result)
StackMapTable((FULL, offset delta=33, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List), (type=Object, class=[Ljava.lang.String;), (type=Integer), (type=Integer)}), (APPEND 1, offset delta=52, locals={(type=Object, class=java.lang.String)}), (CHOP 1, offset delta=41), (CHOP 3, offset delta=5), (FULL, offset delta=22, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List), (type=Object, class=org.springframework.transaction.TransactionStatus), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Integer), (type=Integer)}), (SAME_EXTENDED, offset delta=86), (CHOP 3, offset delta=5), (SAME_LOCALS_1_STACK, offset delta=2, stack items={(type=Object, class=java.lang.RuntimeException)}), (SAME, offset delta=38), (SAME_LOCALS_1_STACK, offset delta=11, stack items={(type=Object, class=java.lang.RuntimeException)}), (CHOP 1, offset delta=29), (APPEND 3, offset delta=10, locals={(type=Object, class=[Ljava.lang.String;), (type=Integer), (type=Integer)}), (SAME, offset delta=32), (CHOP 3, offset delta=5), (SAME_LOCALS_1_STACK, offset delta=2, stack items={(type=Object, class=java.lang.InterruptedException)}), (SAME_LOCALS_1_STACK, offset delta=13, stack items={(type=Object, class=java.lang.RuntimeException)}), (SAME_LOCALS_1_STACK, offset delta=11, stack items={(type=Object, class=java.lang.Throwable)}), (FULL, offset delta=12, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List), (type=Bogus), (type=Bogus), (type=Bogus), (type=Bogus), (type=Bogus), (type=Bogus), (type=Object, class=java.lang.Throwable), (type=Object, class=[Ljava.lang.String;), (type=Integer), (type=Integer)}), (SAME, offset delta=32), (CHOP 3, offset delta=5), (FULL, offset delta=2, locals={(type=Object, class=ool.manager.shop.transaction.DefaultTransactionEngine), (type=Object, class=[Lool.manager.shop.transaction.DefaultTransactionEngine$TransactionOperation;), (type=Object, class=net.sf.ehcache.Ehcache), (type=Object, class=[Ljava.lang.String;), (type=Object, class=java.util.List)}))

  At jp.skypencil.findbugs.slf4j.ThrowableHandler.loadLocalVar(ThrowableHandler.java:111)
  At jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:66)
  At jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
  At edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
  At edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
  At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
  At edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
  At org.apache.bcel.classfile.Code.accept(Code.java:133)
  At edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
  At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
  At org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
  At edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
  At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
  At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
  At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
  At org.sonar.plugins.findbugs.FindbugsExecutor$FindbugsTask.call(FindbugsExecutor.java:199)
  At java.util.concurrent.FutureTask.run(FutureTask.java:262)
  At java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  At java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  At java.lang.Thread.run(Thread.java:724)

Getting SLF4J_FORMAT_SHOULD_BE_CONST on error(String msg)

The following code will reproduce the issue:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class IssueDemonstrator {

    private void triggerWarning() {
        logMessage("This will trigger SLF4J_FORMAT_SHOULD_BE_CONST");
    }

    private void logMessage(String msg) {
        log.error(msg);
    }

}

Maven output to follow:

[INFO] Done FindBugs Analysis....
[INFO]
[INFO] <<< findbugs-maven-plugin:3.0.1:check (default-cli) < :findbugs @ *********** <<<
[INFO]
[INFO] --- findbugs-maven-plugin:3.0.1:check (default-cli) @ * ---
[INFO] BugInstance size is 1
[INFO] Error size is 0
[INFO] Total bugs: 1
[INFO] Format should be constant [
.IssueDemonstrator] At IssueDemonstrator.java:[line 13]
[INFO]

improve README and description

Current documents are not enough to tell problem and the reason of recommendation to improve. To help user enjoys this plugin, it should tell reasonable reason.

SLF4J_PLACE_HOLDER_MISMATCH - no placeholder with Throwable argument

SLF4J_PLACE_HOLDER_MISMATCH should not give warning in the following case:

logger.error("Error ocurred", e);
logger.error("Error ocurred: {}", e.getMessage(), e);

This is valid according to javadoc:
Logger#error(String msg, Throwable t)
Log an exception (throwable) at the ERROR level with an accompanying message.

IllegalPassedClassDetector - getClassConstantOperand called but value not available

Oct 02, 2013 9:51:03 AM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
SEVERE: Exception analyzing ool.manager.shop.impl.DefaultShopManager using detector jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector
java.lang.IllegalStateException: getClassConstantOperand called but value not available
at edu.umd.cs.findbugs.visitclass.DismantleBytecode.getClassConstantOperand(DismantleBytecode.java:298)
at jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector.afterOpcode(IllegalPassedClassDetector.java:32)
at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
at org.apache.bcel.classfile.Code.accept(Code.java:133)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
at org.sonar.plugins.findbugs.FindbugsExecutor$FindbugsTask.call(FindbugsExecutor.java:199)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

Can't get stack offset 0 from []

I get the following error when running the maven plugin with mvn findbugs:findbugs

findbugs-slf4j: 1.2.1
Apache Maven 3.3.3
both jdk1.8.0_60 and 7u76
[INFO] --- findbugs-maven-plugin:3.0.2:findbugs (default-cli) @ console ---
[INFO] Fork Value is true
     [java] The following errors occurred during analysis:
     [java]   Can't get stack offset 0 from [] @ 321 in ool.console.servlet.TinyMCEServlet.service : (Ljavax.servlet.http.HttpServletRequest;Ljavax.servlet.http.HttpServletResponse;)V
     [java]     java.lang.IllegalArgumentException: 0 is not a value stack offset
     [java]       At edu.umd.cs.findbugs.OpcodeStack.getStackItem(OpcodeStack.java:3100)
     [java]       At jp.skypencil.findbugs.slf4j.ManualMessageDetector.isInvokingGetMessage(ManualMessageDetector.java:59)
     [java]       At jp.skypencil.findbugs.slf4j.ManualMessageDetector.afterOpcode(ManualMessageDetector.java:50)
     [java]       At edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:885)
     [java]       At edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:218)
     [java]       At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:235)
     [java]       At edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:63)
     [java]       At org.apache.bcel.classfile.Code.accept(Code.java:135)
     [java]       At edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:307)
     [java]       At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:395)
     [java]       At org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:215)
     [java]       At edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:38)
     [java]       At jp.skypencil.findbugs.slf4j.parameter.AbstractDetectorForParameterArray.visitClassContext(AbstractDetectorForParameterArray.java:69)
     [java]       At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:76)
     [java]       At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1089)
     [java]       At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:283)
     [java]       At edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:402)
     [java]       At edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1200)
     [java] Exception in thread "main" java.lang.AssertionError: Unreachable
     [java]     at jp.skypencil.findbugs.slf4j.parameter.ThrowableHandler.checkThrowable(ThrowableHandler.java:34)
     [java]     at jp.skypencil.findbugs.slf4j.ManualMessageDetector.isInvokingGetMessage(ManualMessageDetector.java:59)
     [java]     at jp.skypencil.findbugs.slf4j.ManualMessageDetector.afterOpcode(ManualMessageDetector.java:50)
     [java]     at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:885)
     [java]     at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:218)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:235)
     [java]     at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:63)
     [java]     at org.apache.bcel.classfile.Code.accept(Code.java:135)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:307)
     [java]     at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:395)
     [java]     at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:215)
     [java]     at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:38)
     [java]     at jp.skypencil.findbugs.slf4j.parameter.AbstractDetectorForParameterArray.visitClassContext(AbstractDetectorForParameterArray.java:69)
     [java]     at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:76)
     [java]     at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1089)
     [java]     at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:283)
     [java]     at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:402)
     [java]     at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1200)

How to suppress warnings?

Sorry if this is the wrong place to ask, but how do I suppress warnings when required?

I've tried putting these annotations on the offending method (one at a time):

@SuppressFBWarnings("SLF4J_FORMAT_SHOULD_BE_CONST")
@SuppressFBWarnings("SLF4J")
@SuppressFBWarnings("CORRECTNESS")

But none of them seems to do anything.

RFE: SLF4J_PARAMETER_TOSTRING

This is a suggestion for a new validation:

When reviewing code, I regularly see folks doing things such as:

LOG.trace("bla bla: {}", dpid.toString());

where that toString() is wrong of course, and can hurt performance.

It would be nice to automatically get any use of toString() in a parameter flagged up.

Gradle example

I tried to use this plugin in a Gradle build

dependencies {
    compile "org.slf4j:slf4j-api:1.7.7"

    findbugsPlugins "jp.skypencil.findbugs.slf4j:findbugs-slf4j:1.2.4"
}

but it failed to detect a trivial violation

LOGGER.info("hello " + Math.random());

Do you happen to have a working example of using this from Gradle, and if so, could you include it in the README alongside the Maven example? Thanks!

SLF4J_FORMAT_SHOULD_BE_CONST should trace caller, to stop warning if all callers use constant value

Currently this plugin marks following case as SLF4J_FORMAT_SHOULD_BE_CONST. refs: #32

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class IssueDemonstrator {

    private void triggerWarning() {
        logMessage("This will trigger SLF4J_FORMAT_SHOULD_BE_CONST");
    }

    private void logMessage(String msg) {
        log.error(msg);
    }

}

But in this case, bytecode detector can trace method-call-tree, and verify that all callers uses constant as msg. This method works only for private methods.

Pattern not working when using Checker Framework

Hi,
I used your plugin for some time now. And first I would like to say: Thank you.

But now I have a problem:

Let's look at this code.

        } catch (final FileNotFoundException ex) {
            logger().debug("File '{}' not found.", file, ex);

If I use your bug pattern with FindBugs all is fine (because there is no parameter for the exception).

Now I started to use the Checker Framework Nullness Checker.
Using it at the same run as your bug pattern extension I run into an error:

[INFO] Count of placeholder(1) is not equal to count of parameter(2) [tmp.Test] At Test.java:[line 32] SLF4J_PLACE_HOLDER_MISMATCH

Perhaps it is related to the annotated JDK, but I don't know.

I created a very simple example, so you could reproduce this error (I used the code as similar as possible to the same in the project the error has been raised).
You can check out it here: https://github.com/maggu2810/findbugs-slf4j-pattern

  • success: mvn -Dfindbugs
  • failure: mvn -Dfindbugs -Dcheckerframework=check

Would be great if you could have a look at.

Logger class name in anonymous class

I have executed the IllegalPassedClassDetector on the Eclipse SmartHome project, and the following bug instance was reported: https://github.com/eclipse/smarthome/blob/bb6fee95637a84d632987bb5030cb8addfd9e7a2/bundles/core/org.eclipse.smarthome.core/src/main/java/org/eclipse/smarthome/core/scheduler/ExpressionThreadPoolManager.java#L90

The message was:

Illegal class is passed to LoggerFactory#getLogger(Class). It should be one of [org.eclipse.smarthome.core.scheduler.ExpressionThreadPoolManager, org.eclipse.smarthome.core.scheduler.ExpressionThreadPoolManager$ExpressionThreadPoolExecutor, org.eclipse.smarthome.core.scheduler.ExpressionThreadPoolManager$ExpressionThreadPoolExecutor$2].

Could this be considered as unexpected behavior ?

RFE: New SLF4J_LOST_EXCEPTION

Proposal for a new check which flags this up as wrong:

} catch (SomeException e) {
    LOG.error("...");
}

but this is, typically, what you want people to do instead of course:

} catch (SomeException e) {
    LOG.error("...", e);
}

I'm well aware that there are exceptions to this general rule, but in a large code base, typically this is what you do want, so in my experience enforcing this helps not having lost exceptions in production logs; and experienced senior developers would @SuppressFBWarnings for the exceptional cases when it's not wanted.

Or does a check similar to this already exist in core FindBugs or other quality control tools?

RFE: SLF4J_LOGGER_NAMING

A new check named something like RFE: SLF4J_LOGGER_NAMING which, by default, would validate that a Logger field is named LOG (if it's static) and logger (?) if it's not, but leave the name customizable through configuration (if SpotBugs/FindBugs allows configuration for indidivual detectors?), could be sweet...

FYI also https://github.com/opendaylight/yangtools/blob/master/common/checkstyle-logging/src/main/java/org/opendaylight/yangtools/checkstyle/LoggerVariableNameCheck.java

WrongPlaceholderDetector ArrayIndexOutOfBoundsException

[java] Mar 12, 2013 6:39:07 PM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
[java] SEVERE: Exception analyzing ool.baket.BasketUndoRemoveCommand using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
[java] java.lang.ArrayIndexOutOfBoundsException: -2
[java] at jp.skypencil.findbugs.slf4j.ThrowableHandler.loadLocalVar(ThrowableHandler.java:95)
[java] at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:65)
[java] at jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
[java] at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] at org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)
[java] Exception analyzing ool.baket.BasketUndoRemoveCommand using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
[java] java.lang.ArrayIndexOutOfBoundsException: -2
[java] At jp.skypencil.findbugs.slf4j.ThrowableHandler.loadLocalVar(ThrowableHandler.java:95)
[java] At jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:65)
[java] At jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
[java] At edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] At edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] At edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] At org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] At org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] At edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] At edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] At edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)

SLF4J_PLACE_HOLDER_MISMATCH wrong number of parametrs

logger.info(Markers.MOJEID, "Uživatel {} se zaregistroval u mojeID a jeho účet byl spárován s účtem v naší aplikaci", ServiceContextHolder.getContext().getAccount());

Reports one placeholder (correct) and two parameters - incorrect.

IllegalStateException: class not found

Looking throuh build output I found several error messages:

java] SEVERE: Exception analyzing ool.android.service.impl.BannerServiceImpl using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
[java] java.lang.IllegalStateException: class not found
[java] at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:75)
[java] at jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
[java] at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] at org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)
[java] Caused by: java.lang.ClassNotFoundException: Exception while looking for class int
[java] at edu.umd.cs.findbugs.AnalysisCacheToRepositoryAdapter.loadClass(AnalysisCacheToRepositoryAdapter.java:89)
[java] at org.apache.bcel.Repository.lookupClass(Repository.java:63)
[java] at jp.skypencil.findbugs.slf4j.JavaType.toJavaClass(JavaType.java:31)
[java] at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:67)
[java] ... 15 more
[java] Caused by: edu.umd.cs.findbugs.classfile.MissingClassException: Resource not found: int.class
[java] at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:61)
[java] at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:42)
[java] at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:266)
[java] at edu.umd.cs.findbugs.classfile.engine.bcel.JavaClassAnalysisEngine.analyze(JavaClassAnalysisEngine.java:56)
[java] at edu.umd.cs.findbugs.classfile.engine.bcel.JavaClassAnalysisEngine.analyze(JavaClassAnalysisEngine.java:42)
[java] at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:266)
[java] at edu.umd.cs.findbugs.AnalysisCacheToRepositoryAdapter.loadClass(AnalysisCacheToRepositoryAdapter.java:87)
[java] ... 18 more
[java] Caused by: edu.umd.cs.findbugs.classfile.ResourceNotFoundException: Resource not found: int.class
[java] at edu.umd.cs.findbugs.classfile.impl.ClassPathImpl.lookupResource(ClassPathImpl.java:158)
[java] at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:59)
[java] ... 24 more
[java] Exception analyzing ool.android.service.impl.BannerServiceImpl using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
[java] java.lang.IllegalStateException: class not found
[java] At jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:75)
[java] At jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
[java] At edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] At edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] At edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] At org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] At org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] At edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] At edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] At edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)

[java] Mar 12, 2013 6:39:07 PM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
[java] SEVERE: Exception analyzing ool.manager.shop.transaction.TransactionInternalNoteHelper using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
[java] java.lang.IllegalStateException: class not found
[java] at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:75)
[java] at jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
[java] at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] at org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)
[java] Caused by: java.lang.ClassNotFoundException: Exception while looking for class boolean
[java] at edu.umd.cs.findbugs.AnalysisCacheToRepositoryAdapter.loadClass(AnalysisCacheToRepositoryAdapter.java:89)
[java] at org.apache.bcel.Repository.lookupClass(Repository.java:63)
[java] at jp.skypencil.findbugs.slf4j.JavaType.toJavaClass(JavaType.java:31)
[java] at jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:67)
[java] ... 15 more
[java] Caused by: edu.umd.cs.findbugs.classfile.MissingClassException: Resource not found: boolean.class
[java] at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:61)
[java] at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:42)
[java] at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:266)
[java] at edu.umd.cs.findbugs.classfile.engine.bcel.JavaClassAnalysisEngine.analyze(JavaClassAnalysisEngine.java:56)
[java] at edu.umd.cs.findbugs.classfile.engine.bcel.JavaClassAnalysisEngine.analyze(JavaClassAnalysisEngine.java:42)
[java] at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:266)
[java] at edu.umd.cs.findbugs.AnalysisCacheToRepositoryAdapter.loadClass(AnalysisCacheToRepositoryAdapter.java:87)
[java] ... 18 more
[java] Caused by: edu.umd.cs.findbugs.classfile.ResourceNotFoundException: Resource not found: boolean.class
[java] at edu.umd.cs.findbugs.classfile.impl.ClassPathImpl.lookupResource(ClassPathImpl.java:158)
[java] at edu.umd.cs.findbugs.classfile.engine.ClassDataAnalysisEngine.analyze(ClassDataAnalysisEngine.java:59)
[java] ... 24 more
[java] Exception analyzing ool.manager.shop.transaction.TransactionInternalNoteHelper using detector jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector
[java] java.lang.IllegalStateException: class not found
[java] At jp.skypencil.findbugs.slf4j.ThrowableHandler.afterOpcode(ThrowableHandler.java:75)
[java] At jp.skypencil.findbugs.slf4j.WrongPlaceholderDetector.afterOpcode(WrongPlaceholderDetector.java:60)
[java] At edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] At edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] At edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] At org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] At edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] At org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] At edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] At edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] At edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] At edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] At edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)

New Detector for arrays, list

Since slf4j automatically adds square brackets to collections, arrays etc passed into the message within square brackets would result in two sets of square brackets.

Example:

final List<String> serviceClasses = Arrays.asList("a","b");
LOGGER.info("Found services [{}]", serviceClasses);

would result in final formatted having two sets of square brackets like Found services [["a","b"]]. It would be nice if we could detect this pattern of [{}] for collection and warn the user.

NullPointerException JavaType.<init>

[java] Mar 19, 2013 6:39:38 PM edu.umd.cs.findbugs.TextUIBugReporter reportAnalysisError
[java] SEVERE: Exception analyzing ool.stat.resourcebundle.ResourceBundleDynamicMBean using detector jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector
[java] java.lang.NullPointerException
[java] at jp.skypencil.findbugs.slf4j.JavaType.(JavaType.java:16)
[java] at jp.skypencil.findbugs.slf4j.IllegalPassedClassDetector.afterOpcode(IllegalPassedClassDetector.java:46)
[java] at edu.umd.cs.findbugs.visitclass.DismantleBytecode.visit(DismantleBytecode.java:809)
[java] at edu.umd.cs.findbugs.visitclass.BetterVisitor.visitCode(BetterVisitor.java:217)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitCode(PreorderVisitor.java:223)
[java] at edu.umd.cs.findbugs.bcel.OpcodeStackDetector.visitCode(OpcodeStackDetector.java:55)
[java] at org.apache.bcel.classfile.Code.accept(Code.java:133)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.doVisitMethod(PreorderVisitor.java:293)
[java] at edu.umd.cs.findbugs.visitclass.PreorderVisitor.visitJavaClass(PreorderVisitor.java:373)
[java] at org.apache.bcel.classfile.JavaClass.accept(JavaClass.java:214)
[java] at edu.umd.cs.findbugs.BytecodeScanningDetector.visitClassContext(BytecodeScanningDetector.java:37)
[java] at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:74)
[java] at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1193)
[java] at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:279)
[java] at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:391)
[java] at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1300)

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.ResourceBundle;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.ReflectionException;

public class ResourceBundleDynamicMBean implements DynamicMBean {
    private static final Logger logger = LoggerFactory.getLogger(ResourceBundleDynamicMBean.class);
    protected final String bundleName;
    protected final ResourceBundle bundle;

    public ResourceBundleDynamicMBean(String bundleName) {
        this.bundleName = bundleName;
        ResourceBundle.clearCache();
        bundle = ResourceBundle.getBundle(bundleName);
    }

    public ResourceBundleDynamicMBean(String bundleName, ResourceBundle bundle) {
        this.bundleName = bundleName;
        this.bundle = bundle;
    }

    @Override
    public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException,
            ReflectionException {
        return bundle.getObject(attribute);
    }

    @Override
    public AttributeList getAttributes(String[] attributes) {
        AttributeList list = new AttributeList();
        for (String attName : attributes) {
            Object val = null;
            try {
                val = getAttribute(attName);
            } catch (AttributeNotFoundException e) {
                logger.error(e.getMessage(), e);
            } catch (MBeanException e) {
                logger.error(e.getMessage(), e);
            } catch (ReflectionException e) {
                logger.error(e.getMessage(), e);
            }
            Attribute attr = new Attribute(attName, val);
            list.add(attr);
        }
        return list;
    }

    @Override
    public MBeanInfo getMBeanInfo() {
        List<MBeanAttributeInfo> attrs = new ArrayList<MBeanAttributeInfo>();
        Enumeration<String> en = bundle.getKeys();
        while (en.hasMoreElements()) {
            String key = en.nextElement();
            Class<?> clazz;
            try {
                String[] str = bundle.getStringArray(key);
                if (str != null) {
                    clazz = str.getClass();
                } else {
                    clazz = String.class;
                }
            } catch (ClassCastException ex) {
                clazz = String.class;
            }
            attrs.add(new MBeanAttributeInfo(key, clazz.getSimpleName(), key, true, false, false));
        }
        return new MBeanInfo(bundleName, bundleName, attrs.toArray(new MBeanAttributeInfo[attrs.size()]),
                null, null, null);
    }

    @Override
    public Object invoke(String actionName, Object[] params, String[] signature)
            throws MBeanException, ReflectionException {
        throw new MBeanException(new IllegalArgumentException(), "Unable invoke");
    }

    @Override
    public void setAttribute(Attribute attribute) throws AttributeNotFoundException,
            InvalidAttributeValueException, MBeanException, ReflectionException {
        throw new MBeanException(new IllegalArgumentException(), "Unable set "
                + attribute.getName());
    }

    @Override
    public AttributeList setAttributes(AttributeList attributes) {
        return null;
    }

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.