Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * fb-contrib - Auxiliary detectors for Java programs
   * Copyright (C) 2005-2015 Dave Brosius
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 package com.mebigfatguy.fbcontrib.detect;
 
 import java.io.File;
 import java.net.URL;
 import java.util.Map;
 import java.util.Set;
 
 
 
looks for calls to classes and methods that do not exist in the JDK for which this class is compiled. This can happen if you specify the -source and -target options of the javac compiler, and specify a target that is less than the jdk version of the javac compiler.
 
 {
 	private static final Map<IntegerStringVER_REG_EX = new HashMap<IntegerString>();
 	static {
 		.put(Integer.valueOf(.), "(jdk|j2?re)1.1");
 		.put(Integer.valueOf(.), "(jdk|j2?re)1.2");
 		.put(Integer.valueOf(.), "(jdk|j2?re)1.3");
 		.put(Integer.valueOf(.), "(jdk|j2?re)1.4");
 		.put(Integer.valueOf(.), "((jdk|j2?re)1.5)|(java-5)");
 		.put(Integer.valueOf(.), "((jdk|j2?re)1.6)|(java-6)");
         .put(Integer.valueOf(.), "((jdk|j2?re)1.7)|(java-7)");
         .put(Integer.valueOf(.), "((jdk|j2?re)1.8)|(java-8)");
 	}
 	private static final Map<IntegerIntegerHUMAN_VERSIONS = new HashMap<IntegerInteger>();
 	static {
 	}
 	private static final Pattern jarPattern = Pattern.compile("jar:file:/*([^!]*)");
 	private static final String SJVU_JDKHOME = "fb-contrib.sjvu.jdkhome";
 
 	private final Map<StringFileversionPaths;
 	private final Map<IntegerMap<StringSet<String>>> validMethodsByVersion;
 	private final Map<StringStringsuperNames;
 	private final Map<IntegerZipFilejdkZips;
 	private File jdksRoot = null;
 	private ZipFile jdkZip;
 	private final BugReporter bugReporter;
 
 	public SuspiciousJDKVersionUse(BugReporter bugReporter) {
 		this. = bugReporter;
 		 = new HashMap<StringFile>();
 		 = new HashMap<IntegerZipFile>();
 		 = new HashMap<StringString>();
 	}
 
	public void visitClassContext(ClassContext classContext) {
		try {
			 = Integer.valueOf(classContext.getJavaClass().getMajor());
			if ( == null) {
				File rtJar = getRTJarFile();
				if (rtJar == null)
				if (rtJar != null) {
					 = new ZipFile(rtJar);
				}
			}
			if ( == null)
				return;
			super.visitClassContext(classContext);
catch (IOException ioe) {
			//Hmm What to do
finally {
			 = null;
		}
	}
	public void sawOpcode(int seen) {
		String clsName;
		try {
			if ((seen == //Interfaces are more difficult, ignore for now
			||  (seen == )
			||  (seen == )) {
				if ((clsName.startsWith("java/"))
				||  (clsName.startsWith("javax/"))) {
					if (m == null)
						return;
					if (validMethods == null) {
						validMethods = new HashMap<StringSet<String>>();
					}
					if (!isValid(validMethodsclsName)) {
								   .addClass(this)
								   .addMethod(this)
								   .addSourceLine(this)
								   .addCalledMethod(this));
					}
				}
			}
catch (ClassNotFoundException cnfe) {
catch (IOException ioe) {
			//Hmm what do do.
		}
	}
	private Method findCalledMethod() {
		try {
			Method[] methods = clss.getMethods();
			String calledMethod = getNameConstantOperand();
			String calledSignature = getSigConstantOperand();
			for (Method m : methods) {
				if (m.getName().equals(calledMethod) && m.getSignature().equals(calledSignature)) {
					return m;
				}
			}
			return null;
catch (ClassNotFoundException cnfe) {
			return null;
		}
	}
	private boolean isValid(Map<StringSet<String>> validMethodsString clsNamethrows IOExceptionClassNotFoundException {
		InputStream is = null;
		try {
			Set<StringmethodInfos = validMethods.get(clsName);
			if (methodInfos == null) {
				ZipEntry ze = .getEntry(clsName + ".class");
				if (ze != null) {
					ClassParser parser = new ClassParser(isclsName);
					JavaClass calledClass = parser.parse();
					.put(clsNamecalledClass.getSuperclassName().replace('.''/'));
					Method[] methods = calledClass.getMethods();
					methodInfos = new HashSet<String>(methods.length);
					validMethods.put(clsNamemethodInfos);
					for (Method m : methods) {
						methodInfos.add(m.getName() + m.getSignature());
					}
else if (clsName.startsWith("java/")) {
							   .addClass(this)
							   .addMethod(this)
							   .addSourceLine(this)
							   .addClass(clsName));
				}
			}
			if (methodInfos != null) {
				if (methodInfos.contains(wantedMethod))
					return true;
				else if ("java/lang/Object".equals(clsName))
					return false;
				else
					return isValid(validMethods.get(clsName));
			}
			return true;
		}
		finally {
			if (is != null) {
				try {
					is.close();
catch (IOException ioe) {
					// don't care
				}
			}
		}
	}
	private File getRTJarFile(){
		if (versionStr == null)
			return null;
		File rtPath = .get(versionStr);
		if (rtPath != null)
			return rtPath;
		if (.containsKey(versionStr))
			return null;
		if ( == null) {
			URL jdkUrl = SuspiciousJDKVersionUse.class.getResource("/java/lang/Object.class");
			if (jdkUrl != null) {
				if (m.find()) {
					String path = m.group(1);
					 = new File(path);
					Pattern verPat = Pattern.compile(versionStr);
					m = verPat.matcher(.getName());
					while ((.getParentFile() != null) && !m.find()) {
						m = verPat.matcher(.getName());
					}
					if (.getParentFile() == null) {
						.put(versionStrnull);
						return null;
					}
					try {
						String encoding = System.getProperty("file.encoding");
						 = new File(URLDecoder.decode(.getParentFile().getPath(), encoding));
catch (UnsupportedEncodingException uee) {
						.put(versionStrnull);
						return null;
					}
				}
			}
		}
		if ( != null) {
			File[] possibleJdks = .listFiles();
			if (possibleJdks != null) {
				for (File possibleJdk : possibleJdks) {
					Pattern verPat = Pattern.compile(versionStr);
					Matcher m = verPat.matcher(possibleJdk.getName());
					if (m.find()) {
						File wantedRtJar = new File(possibleJdk"lib/rt.jar");
						if (!wantedRtJar.exists()) {
							wantedRtJar = new File(possibleJdk"jre/lib/rt.jar");
							if (!wantedRtJar.exists()) {
								.put(versionStrnull);
								return null;
							}
						}
						.put(versionStrwantedRtJar);
						return wantedRtJar;
					}
				}
			}
		}
		.put(versionStrnull);
		return null;
	}
	private static File getRTJarFromProperty(Integer requestedVersion) {
		String jdkHome = System.getProperty( + "." + .get(requestedVersion));
		if (jdkHome == null)
			return null;
		File rtJar = new File(jdkHome"lib/rt.jar");
		if (rtJar.exists())
			return rtJar;
		rtJar = new File(jdkHome"jre/lib/rt.jar");
		if (rtJar.exists())
			return rtJar;
		return null;
	}
New to GrepCode? Check out our FAQ X