List of usage examples for org.eclipse.jdt.internal.core BinaryType getSourceFileName
public String getSourceFileName(IBinaryType info)
From source file:edu.uci.ics.sourcerer.extractor.ast.FeatureExtractor.java
License:Open Source License
public ClassExtractionReport extractClassFiles(Collection<IClassFile> classFiles, boolean force) { ClassExtractionReport report = new ClassExtractionReport(); ClassFileExtractor extractor = new ClassFileExtractor(bundle); ReferenceExtractorVisitor visitor = new ReferenceExtractorVisitor(bundle); IMissingTypeWriter missingTypeWriter = bundle.getMissingTypeWriter(); for (IClassFile classFile : classFiles) { try {//from w ww .ja va2 s .co m if (ClassFileExtractor.isTopLevelOrAnonymous(classFile)) { ISourceRange source = classFile.getSourceRange(); boolean hasSource = true; if (source == null || source.getLength() == 0) { source = classFile.getSourceRange(); if (source == null || source.getLength() == 0) { hasSource = false; } } if (hasSource) { // Verify that the source file matches the binary file BinaryType type = (BinaryType) classFile.getType(); if (type.isAnonymous()) { continue; } String sourceFile = type.getPackageFragment().getElementName() + "." + type.getSourceFileName(null); String fqn = classFile.getType().getFullyQualifiedName() + ".java"; if (!fqn.equals(sourceFile)) { // logger.log(Level.WARNING, "Source fqn mismatch: " + sourceFile + " " + fqn); continue; } } if (!hasSource || Extractor.EXTRACT_BINARY.getValue()) { extractor.extractClassFile(classFile); report.reportBinaryExtraction(); if (hasSource) { report.reportSourceSkipped(); } } else { try { parser.setStatementsRecovery(true); parser.setResolveBindings(true); parser.setBindingsRecovery(true); parser.setSource(classFile); CompilationUnit unit = (CompilationUnit) parser.createAST(null); boolean foundProblem = false; // start by checking for a "public type" error // just skip this unit in if one is found for (IProblem problem : unit.getProblems()) { if (problem.isError() && problem.getID() == IProblem.PublicClassMustMatchFileName) { foundProblem = true; } } if (foundProblem) { continue; } boolean secondOrder = checkForMissingTypes(unit, report, missingTypeWriter); if (force || !report.hadMissingType()) { if (secondOrder) { visitor.setBindingFreeMode(true); } try { unit.accept(visitor); report.reportSourceExtraction(); } catch (Exception e) { logger.log(Level.SEVERE, "Error in extracting " + classFile.getElementName(), e); for (IProblem problem : unit.getProblems()) { if (problem.isError()) { logger.log(Level.SEVERE, "Error in source for class file (" + classFile.getElementName() + "): " + problem.getMessage()); } } report.reportSourceExtractionException(); try { extractor.extractClassFile(classFile); report.reportBinaryExtraction(); } catch (Exception e2) { logger.log(Level.SEVERE, "Unable to extract " + classFile.getElementName(), e2); report.reportBinaryExtractionException(); } } visitor.setBindingFreeMode(false); } } catch (Exception e) { logger.log(Level.SEVERE, "Error in extracting " + classFile.getElementName(), e); extractor.extractClassFile(classFile); report.reportBinaryExtraction(); } } } } catch (Exception e) { logger.log(Level.SEVERE, "Unable to extract " + classFile.getElementName(), e); report.reportBinaryExtractionException(); } } return report; }
From source file:edu.uci.ics.sourcerer.tools.java.extractor.eclipse.EclipseExtractor.java
License:Open Source License
public boolean extractClassFiles(Collection<IClassFile> classFiles) { TaskProgressLogger task = TaskProgressLogger.get(); task.start("Extracting " + classFiles.size() + " class files", "class files extracted", 500); boolean oneWithSource = false; Map<String, Collection<IClassFile>> memberMap = new HashMap<>(); ;// www.j a v a 2s . c om Set<String> sourceFailed = new HashSet<>(); Collection<IClassFile> parentTypes = new LinkedList<>(); for (IClassFile classFile : classFiles) { IType type = classFile.getType(); try { if (type.isMember() || type.isAnonymous() || type.isLocal()) { String key = null; IType dec = type.getDeclaringType(); if (dec == null) { key = classFile.getElementName(); int dollar = key.indexOf('$'); if (dollar == -1) { if (classFile.getSource() == null) { // Doesn't matter, just make it a parentType parentTypes.add(classFile); } else { logger.log(Level.SEVERE, "Should have a dollar: " + key); } } else { key = key.substring(0, dollar) + ".class"; } } else { key = dec.getClassFile().getElementName(); } if (key != null) { Collection<IClassFile> members = memberMap.get(key); if (members == null) { members = new LinkedList<>(); memberMap.put(key, members); } members.add(classFile); } } else { parentTypes.add(classFile); } } catch (Exception e) { logger.log(Level.SEVERE, classFile.getType().getFullyQualifiedName(), e); sourceFailed.add(classFile.getType().getFullyQualifiedName()); extractClassFile(classFile); } } for (IClassFile classFile : parentTypes) { task.progress(); try { IBuffer buffer = classFile.getBuffer(); if (buffer == null || buffer.getLength() == 0) { extractClassFile(classFile); sourceFailed.add(classFile.getType().getFullyQualifiedName()); } else { IType type = classFile.getType(); // Handle Eclipse issue with GSSUtil if ("sun.security.jgss.GSSUtil".equals(type.getFullyQualifiedName())) { extractClassFile(classFile); sourceFailed.add(classFile.getType().getFullyQualifiedName()); continue; } // Handle multiple top-level types { BinaryType bType = (BinaryType) type; String sourceFile = type.getPackageFragment().getElementName() + "." + bType.getSourceFileName(null); String fqn = classFile.getType().getFullyQualifiedName() + ".java"; if (!fqn.equals(sourceFile)) { continue; } } parser.setStatementsRecovery(true); parser.setResolveBindings(true); parser.setBindingsRecovery(true); parser.setSource(classFile); CompilationUnit unit = (CompilationUnit) parser.createAST(null); boolean foundProblem = false; // start by checking for a "public type" error // just skip this unit in if one is found for (IProblem problem : unit.getProblems()) { if (problem.isError() && problem.getID() == IProblem.PublicClassMustMatchFileName) { foundProblem = true; } } if (foundProblem) { logger.log(Level.WARNING, "Giving up on " + classFile.getElementName()); continue; } boolean trouble = checkForMissingTypes(unit); if (trouble) { sourceFailed.add(classFile.getType().getFullyQualifiedName()); extractClassFile(classFile); } else { try { visitor.setCompilationUnitSource(classFile.getSource()); visitor.setAdvisor( NamingAdvisor.create(classFile, memberMap.get(classFile.getElementName()))); unit.accept(visitor); oneWithSource = true; } catch (Exception e) { logger.log(Level.SEVERE, "Error in extracting " + classFile.getElementName(), e); // for (IProblem problem : unit.getProblems()) { // if (problem.isError()) { // logger.log(Level.SEVERE, "Error in source for class file (" + classFile.getElementName() + "): " + problem.getMessage()); // } // } sourceFailed.add(classFile.getType().getFullyQualifiedName()); extractClassFile(classFile); } } } } catch (JavaModelException | ClassCastException | IllegalArgumentException | NullPointerException e) { logger.log(Level.SEVERE, classFile.getElementName(), e); sourceFailed.add(classFile.getType().getFullyQualifiedName()); extractClassFile(classFile); } } for (String failed : sourceFailed) { Collection<IClassFile> members = memberMap.get(failed); if (members != null) { for (IClassFile classFile : members) { extractClassFile(classFile); } } } task.finish(); return oneWithSource; }