/*
 *    Copyright (c) 2008-2011 Graham Allan
 *
 *   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.
 *
 */
package org.mutabilitydetector;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.mutabilitydetector.checkers.AsmMutabilityChecker;
import org.mutabilitydetector.checkers.ResultCalculator;
import org.mutabilitydetector.checkers.info.AnalysisDatabase;
import org.mutabilitydetector.locations.Dotted;

public final class AllChecksRunner {

    private final Dotted toAnalyse;
    private final Collection<MutableReasonDetail> reasons = new ArrayList<MutableReasonDetail>();
    private final MutabilityCheckerFactory factory;
    private final CheckerRunnerFactory checkerRunnerFactory;
    private final AnalysisClassLoader analysisClassLoader;

    public AllChecksRunner(MutabilityCheckerFactory checkerFactory,
            CheckerRunnerFactory checkerRunnerFactory,
            AnalysisClassLoader analysisClassLoader, 
            Dotted toAnalyse) {
        this.factory = checkerFactory;
        this.checkerRunnerFactory = checkerRunnerFactory;
        this.analysisClassLoader = analysisClassLoader;
        this.toAnalyse = toAnalyse;
    }

    public AnalysisResult runCheckers(AnalysisSession analysisSession, AnalysisDatabase database) {
        Map<IsImmutable, Integer> results = new HashMap<IsImmutable, Integer>();

        Iterable<AsmMutabilityChecker> checkers = factory.createInstances(analysisSession, database, analysisClassLoader);

        for (AsmMutabilityChecker checker : checkers) {
            checkerRunnerFactory.createRunner().run(analysisSession, checker, toAnalyse);
            IsImmutable result = checker.result();
            results.put(result, getNewCount(results, result));
            reasons.addAll(checker.reasons());
        }

        IsImmutable isImmutable = new ResultCalculator().calculateImmutableStatus(results);

        return AnalysisResult.analysisResult(toAnalyse.asString(), isImmutable, reasons);
    }

    private Integer getNewCount(Map<IsImmutable, Integer> results, IsImmutable result) {
        Integer oldCount = results.get(result);
        if (oldCount == null) oldCount = 0;
        return (oldCount + 1);
    }

}

@@ -666,28 +666,118 @@
 ort 
-java.util.ArrayList;
+static com.google.common.collect.Lists.newArrayList;%0Aimport static com.google.common.collect.Maps.newHashMap;%0A
 %0Aimp
@@ -806,34 +806,8 @@
 on;%0A
-import java.util.HashMap;%0A
 impo
@@ -1096,142 +1096,8 @@
  %7B%0A%0A
-    private final Dotted toAnalyse;%0A    private final Collection%3CMutableReasonDetail%3E reasons = new ArrayList%3CMutableReasonDetail%3E();%0A
     
@@ -1263,16 +1263,52 @@
 sLoader;
+%0A    private final Dotted toAnalyse;
 %0A%0A    pu
@@ -1857,38 +1857,81 @@
  new
- 
 HashMap
-%3CIsImmutable, Integer%3E
+();%0A        Collection%3CMutableReasonDetail%3E reasons = newArrayList
 ();%0A

Change field to a local variable.