/* 
 * Mutability Detector
 *
 * Copyright 2009 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 static org.mutabilitydetector.checkers.SetterMethodChecker.newSetterMethodChecker;
import static org.mutabilitydetector.checkers.info.AnalysisDatabase.PRIVATE_METHOD_INVOCATION;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import org.mutabilitydetector.checkers.AbstractTypeToFieldChecker;
import org.mutabilitydetector.checkers.FinalClassChecker;
import org.mutabilitydetector.checkers.IMutabilityChecker;
import org.mutabilitydetector.checkers.InherentTypeMutabilityChecker;
import org.mutabilitydetector.checkers.MutableTypeToFieldChecker;
import org.mutabilitydetector.checkers.PublishedNonFinalFieldChecker;
import org.mutabilitydetector.checkers.info.AnalysisDatabase;


public class MutabilityCheckerFactory implements IMutabilityCheckerFactory {

	@Override
	public Collection<IMutabilityChecker> createInstances(IAnalysisSession analysisSession) {
		Collection<IMutabilityChecker> checkers = new ArrayList<IMutabilityChecker>();
		checkers.add(new FinalClassChecker());
		checkers.add(new AbstractTypeToFieldChecker());
		checkers.add(new PublishedNonFinalFieldChecker());
		AnalysisDatabase database = analysisSession.analysisDatabase();
		checkers.add(newSetterMethodChecker(database.requestInformation(PRIVATE_METHOD_INVOCATION)));
		checkers.add(new MutableTypeToFieldChecker(analysisSession));
		checkers.add(new InherentTypeMutabilityChecker());
//		checkers.add(new InheritedMutabilityChecker(analysisSession));
//		checkers.add(new NoCopyOfFieldChecker()); - or whatever it's going to be called.
		return Collections.unmodifiableCollection(checkers);
	}

}

@@ -650,16 +650,120 @@
 ector;%0A%0A
+import static org.mutabilitydetector.checkers.AbstractTypeToFieldChecker.newAbstractTypeToFieldChecker;%0A
 import s
@@ -836,32 +836,32 @@
 rMethodChecker;%0A
-
 import static or
@@ -938,16 +938,100 @@
 OCATION;
+%0Aimport static org.mutabilitydetector.checkers.info.AnalysisDatabase.TYPE_STRUCTURE;
 %0A%0Aimport
@@ -1116,75 +1116,8 @@
 s;%0A%0A
-import org.mutabilitydetector.checkers.AbstractTypeToFieldChecker;%0A
 impo
@@ -1679,16 +1679,83 @@
 sion) %7B%0A
+%09%09AnalysisDatabase database = analysisSession.analysisDatabase();%0A%0A
 %09%09Collec
@@ -1886,17 +1886,16 @@
 .add(new
- 
 Abstract
@@ -1905,32 +1905,75 @@
 eToFieldChecker(
+database.requestInformation(TYPE_STRUCTURE)
 ));%0A%09%09checkers.a
@@ -2017,74 +2017,8 @@
 ));%0A
-%09%09AnalysisDatabase database = analysisSession.analysisDatabase();%0A
 %09%09ch

Change the AbstractTypeToFieldChecker to use the new TypeStructureInformation lookup object. This avoids nasty class loading.