//
// Copyright (C) 2012 United States Government as represented by the
// Administrator of the National Aeronautics and Space Administration
// (NASA). All Rights Reserved.
//
// This software is distributed under the NASA Open Source Agreement
// (NOSA), version 1.3. The NOSA has been approved by the Open Source
// Initiative. See the file NOSA-1.3-JPF at the top of the distribution
// directory tree for the complete NOSA document.
//
// THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
// KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
// LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
// SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
// A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
// THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
// DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
//
package gov.nasa.jpf.conformanceChecker.checkers;
import gov.nasa.jpf.conformanceChecker.Inconsistency;
import gov.nasa.jpf.conformanceChecker.Inconsistency.InconsistencyType;
import gov.nasa.jpf.conformanceChecker.comparators.MethodInfoComparator;
import gov.nasa.jpf.conformanceChecker.providers.ProviderFactory;
import gov.nasa.jpf.conformanceChecker.providers.StandardClassProvider;
import gov.nasa.jpf.conformanceChecker.reporters.Reporter;
import gov.nasa.jpf.conformanceChecker.util.MaybeVersion;
import gov.nasa.jpf.jvm.ClassInfo;
import gov.nasa.jpf.jvm.MethodInfo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Class that checks for methods present in the model class but
* not in the standard library version.
*
* @see InconsistencyType#ORPHAN_METHOD
*
* @author Matteo Ceccarello <matteo.ceccarello AT gmail.com>
*
*/
public class OrphanMethodChecker extends Checker {
MethodInfoComparator comp = new MethodInfoComparator();
StandardClassProvider provider;
public OrphanMethodChecker() {
super();
this.provider = ProviderFactory.getStandardProvider();
}
public OrphanMethodChecker(List<Reporter> reporters) {
super(reporters);
this.provider = ProviderFactory.getStandardProvider();
}
public OrphanMethodChecker(List<Reporter> reporters, MemberLevel level) {
super(reporters, level);
this.provider = ProviderFactory.getStandardProvider();
}
@Override
public boolean check(ClassInfo cls) {
Map<MaybeVersion, ClassInfo> standardVersions = provider.loadClassInfo(cls.getName());
boolean noInconsistencies = true;
for (MaybeVersion version : standardVersions.keySet()) {
// TODO see if it's better to work on copies
MethodInfo[] standardMethods = standardVersions.get(version).getDeclaredMethodInfos();
MethodInfo[] modelMethods = cls.getDeclaredMethodInfos();
Arrays.sort(standardMethods, comp);
for (MethodInfo m : modelMethods) {
// TODO render constructors properly
if (!"<init>".equals(m.getName()) && // it's not a constructor
MemberLevel.getMemberLevel(m).compareTo(this.level) >= 0) {
if(Arrays.binarySearch(standardMethods, m, comp) < 0) {
signal(new Inconsistency(
InconsistencyType.ORPHAN_METHOD,
version,
m.getClassInfo(),
m,
"This method is present in the model class, but not " +
"in the library version."));
noInconsistencies = false;
}
}
}
}
return noInconsistencies;
}
}