content: /**
   * JReversePro - Java Decompiler / Disassembler.
   * Copyright (C) 2008 Karthik Kumar.
   * 
   * Licensed under the Apache License, Version 2.0 (the "License"); 
   * you may not use this file except in compliance with the License. 
   * You may obtain a copy of the License at 
   *  
   *  	http://www.apache.org/licenses/LICENSE-2.0 
   *  
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS, 
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
   * See the License for the specific language governing permissions and
   * limitations under the License. * 
   */
  package org.jreversepro.parser.common;
  
  import java.io.DataInputStream;
  import java.io.IOException;
  import java.util.List;
  
  import org.jreversepro.parser.ClassFileParser;
  import org.jreversepro.parser.ClassParserException;
  import org.jreversepro.reflect.ClassInfo;
  import org.jreversepro.reflect.ConstantPool;
  import org.jreversepro.reflect.Field;
  import org.jreversepro.reflect.Method;
  
  
  public class DefaultClassFileParser implements ClassFileParser {
  
    /**
     * Parses the given file and creates the ClassInfo and ConstantPool objects.
     * 
     * @param dis
     *          InputStream containing the bytes.
     * @param pathToClass
     *          path to the class.
     * @throws ClassParserException
     *           Thrown if class file not in desired format.
     * @throws IOException
     *           Thrown if error in stream of bytes containing the class file.
     */
    public ClassInfo parseInputStream(DataInputStream dis, String pathToClass)
        throws IOException, ClassParserException {
  
      ConstantPool cp = AbstractClassFileParser.readConstantPool(dis);
      ClassInfo clazz = new ClassInfo(cp);
      short access = AbstractClassFileParser.readAccess(dis);
  
      clazz.setAccess(access);
  
      // <p>
      // For Example , a class by name <code>JClassParser</code> in the
      // package
      // <code>Heart</code> would be saved as: <code>Heart/JClassParser</code>
      // </p>.
      short thisClassIndex = AbstractClassFileParser.readThisClassIndex(dis);
      clazz.setThisClass(cp.getClassName(thisClassIndex));
  
      short superClassIndex = AbstractClassFileParser.readSuperClassIndex(dis);
      clazz.setSuperClass(cp.getClassName(superClassIndex));
  
      List<String> interfaceNames = AbstractClassFileParser.readInterfaces(dis,
          cp);
      clazz.setInterfaces(interfaceNames);
  
      List<Field> fields = AbstractClassFileParser.readFields(dis, cp);
      clazz.setFields(fields);
  
      List<Method> methods = AbstractClassFileParser.readMethods(dis, cp);
      clazz.setMethods(methods);
  
      AbstractClassFileParser.readClassAttributes(dis, cp, clazz);
  
      return clazz;
    }
  
  }
  