Example usage for org.eclipse.jdt.internal.core BinaryType getSourceFileName

List of usage examples for org.eclipse.jdt.internal.core BinaryType getSourceFileName

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.core BinaryType getSourceFileName.

Prototype

public String getSourceFileName(IBinaryType info) 

Source Link

Usage

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;
}