001    package org.extendj.ast;
002    
003    import java.util.HashSet;
004    import java.io.File;
005    import java.util.Set;
006    import java.util.Collections;
007    import java.util.Collection;
008    import java.util.ArrayList;
009    import beaver.*;
010    import java.util.*;
011    import java.io.ByteArrayOutputStream;
012    import java.io.PrintStream;
013    import java.lang.reflect.InvocationTargetException;
014    import java.lang.reflect.Method;
015    import org.jastadd.util.*;
016    import java.util.zip.*;
017    import java.io.*;
018    import org.jastadd.util.PrettyPrintable;
019    import org.jastadd.util.PrettyPrinter;
020    import java.io.FileNotFoundException;
021    import java.io.BufferedInputStream;
022    import java.io.DataInputStream;
023    /**
024     * @ast class
025     * @aspect PathPart
026     * @declaredat /home/jesper/git/extendj/java4/frontend/PathPart.jadd:189
027     */
028    public abstract class BytecodeClassSource extends ClassSource {
029      
030        public BytecodeClassSource(PathPart sourcePath) {
031          super(sourcePath);
032        }
033    
034      
035    
036        @Override
037        public CompilationUnit parseCompilationUnit(Program program) throws IOException {
038          InputStream is = openInputStream();
039          try {
040            if (program.options().verbose()) {
041              System.out.print("Loading " + sourceName());
042            }
043    
044            long start = System.nanoTime();
045            CompilationUnit u = program.bytecodeReader.read(is, sourceName(), program);
046            long elapsed = System.nanoTime() - start;
047            program.bytecodeParseTime += elapsed;
048            program.numClassFiles += 1;
049    
050            u.setFromSource(false);
051            u.setClassSource(this);
052    
053            if (program.options().verbose()) {
054              System.out.println(" in " + (elapsed / 1000000) + " ms");
055            }
056            return u;
057          } catch (AbstractClassfileParser.ClassfileFormatError e) {
058            throw new AbstractClassfileParser.ClassfileFormatError(
059                String.format("Error loading classfile %s: %s\n", sourceName(), e.getMessage()));
060          } catch (Exception e) {
061            throw new Error("Error loading classfile " + sourceName(), e);
062          } finally {
063            if (is != null) {
064              try {
065                is.close();
066              } catch (IOException e) {
067              }
068            }
069          }
070        }
071    
072    
073    }