Пример #1
0
  public String toString() {
    StringBuilder sb = new StringBuilder();
    if (!access.equals(Access.NONE)) sb.append(access.toString()).append(" ");
    if (_static) sb.append("static").append(" ");
    if (_interface) sb.append("interface").append(" ");
    else if (_abstract) sb.append("abstract class").append(" ");
    else sb.append("class").append(" ");
    sb.append(name).append(" ");
    sb.append("extends ").append(superclass);
    if (!interfaceList.isEmpty()) {
      sb.append(" ").append("implements ");
      for (int i = 0; i < interfaceList.size() - 1; i++)
        sb.append(interfaceList.get(i)).append(", ");
      sb.append(interfaceList.get(interfaceList.size() - 1));
    }
    sb.append("\n\n").append("Fields:");
    for (FieldObject field : fieldList) sb.append("\n").append(field.toString());

    sb.append("\n\n").append("Constructors:");
    for (ConstructorObject constructor : constructorList)
      sb.append("\n").append(constructor.toString());

    sb.append("\n\n").append("Methods:");
    for (MethodObject method : methodList) sb.append("\n").append(method.toString());

    return sb.toString();
  }
Пример #2
0
  public void createFieldObject() throws IOException {
    while (freePixel()) {
      /** Creating Player/Ball Object * */
      Point currentPoint = getNextFreePixel();
      points = new ArrayList<Point>();
      calcNeighbors(currentPoint);

      if (points.size() > 20) {
        FieldObject fo = new FieldObject();
        fo.setPoints(points);
        allBlackObjects.add(fo);
        // allBlackObjects.add(currentObject);
      }
    }
    // System.out.println(allBlackObjects.size() + " Object/s");
    // System.out.println("---------------------------------");

    Iterator<FieldObject> allBlackObjectsIt = allBlackObjects.iterator();
    System.out.println(allBlackObjects.size() + " Objects found.");
    while (allBlackObjectsIt.hasNext()) {
      FieldObject currentObject = allBlackObjectsIt.next();
      writeObject(currentObject);
      //			Iterator<Point> currentObjectIt = currentObject.iterator();
      //			while (currentObjectIt.hasNext()) {
      //				Point currentPoint = currentObjectIt.next();
      //				// System.out.println(currentPoint.getX() + "/" +
      //				// currentPoint.getY());
      //
      //			}
    }
  }
Пример #3
0
 public boolean isFriend(String className) {
   if (superclass != null) {
     if (superclass.getClassType().equals(className)) return true;
   }
   for (TypeObject interfaceType : interfaceList) {
     if (interfaceType.getClassType().equals(className)) return true;
   }
   for (FieldObject field : fieldList) {
     TypeObject fieldType = field.getType();
     if (checkFriendship(fieldType, className)) return true;
   }
   for (ConstructorObject constructor : constructorList) {
     ListIterator<ParameterObject> parameterIterator = constructor.getParameterListIterator();
     while (parameterIterator.hasNext()) {
       ParameterObject parameter = parameterIterator.next();
       TypeObject parameterType = parameter.getType();
       if (checkFriendship(parameterType, className)) return true;
     }
     for (CreationObject creation : constructor.getCreations()) {
       TypeObject creationType = creation.getType();
       if (checkFriendship(creationType, className)) return true;
     }
   }
   for (MethodObject method : methodList) {
     TypeObject returnType = method.getReturnType();
     if (checkFriendship(returnType, className)) return true;
     ListIterator<ParameterObject> parameterIterator = method.getParameterListIterator();
     while (parameterIterator.hasNext()) {
       ParameterObject parameter = parameterIterator.next();
       TypeObject parameterType = parameter.getType();
       if (checkFriendship(parameterType, className)) return true;
     }
     for (CreationObject creation : method.getCreations()) {
       TypeObject creationType = creation.getType();
       if (checkFriendship(creationType, className)) return true;
     }
   }
   if (superclass != null) {
     ClassObject superclassObject =
         ASTReader.getSystemObject().getClassObject(superclass.getClassType());
     if (superclassObject != null) return superclassObject.isFriend(className);
   }
   return false;
 }
Пример #4
0
  private List<ClassObject> parseAST(CompilationUnit compilationUnit, IFile iFile) {
    List<ClassObject> classObjects = new ArrayList<ClassObject>();
    List<AbstractTypeDeclaration> topLevelTypeDeclarations = compilationUnit.types();
    for (AbstractTypeDeclaration abstractTypeDeclaration : topLevelTypeDeclarations) {
      if (abstractTypeDeclaration instanceof TypeDeclaration) {
        TypeDeclaration topLevelTypeDeclaration = (TypeDeclaration) abstractTypeDeclaration;
        List<TypeDeclaration> typeDeclarations = new ArrayList<TypeDeclaration>();
        typeDeclarations.add(topLevelTypeDeclaration);
        typeDeclarations.addAll(getRecursivelyInnerTypes(topLevelTypeDeclaration));
        for (TypeDeclaration typeDeclaration : typeDeclarations) {
          final ClassObject classObject = new ClassObject();
          classObject.setIFile(iFile);
          classObject.setName(typeDeclaration.resolveBinding().getQualifiedName());
          classObject.setTypeDeclaration(typeDeclaration);

          if (typeDeclaration.isInterface()) {
            classObject.setInterface(true);
          }

          int modifiers = typeDeclaration.getModifiers();
          if ((modifiers & Modifier.ABSTRACT) != 0) classObject.setAbstract(true);

          if ((modifiers & Modifier.PUBLIC) != 0) classObject.setAccess(Access.PUBLIC);
          else if ((modifiers & Modifier.PROTECTED) != 0) classObject.setAccess(Access.PROTECTED);
          else if ((modifiers & Modifier.PRIVATE) != 0) classObject.setAccess(Access.PRIVATE);
          else classObject.setAccess(Access.NONE);

          if ((modifiers & Modifier.STATIC) != 0) classObject.setStatic(true);

          Type superclassType = typeDeclaration.getSuperclassType();
          if (superclassType != null) {
            ITypeBinding binding = superclassType.resolveBinding();
            String qualifiedName = binding.getQualifiedName();
            TypeObject typeObject = TypeObject.extractTypeObject(qualifiedName);
            classObject.setSuperclass(typeObject);
          }

          List<Type> superInterfaceTypes = typeDeclaration.superInterfaceTypes();
          for (Type interfaceType : superInterfaceTypes) {
            ITypeBinding binding = interfaceType.resolveBinding();
            String qualifiedName = binding.getQualifiedName();
            TypeObject typeObject = TypeObject.extractTypeObject(qualifiedName);
            classObject.addInterface(typeObject);
          }

          FieldDeclaration[] fieldDeclarations = typeDeclaration.getFields();
          for (FieldDeclaration fieldDeclaration : fieldDeclarations) {
            Type fieldType = fieldDeclaration.getType();
            ITypeBinding binding = fieldType.resolveBinding();
            List<VariableDeclarationFragment> fragments = fieldDeclaration.fragments();
            for (VariableDeclarationFragment fragment : fragments) {
              String qualifiedName = binding.getQualifiedName();
              TypeObject typeObject = TypeObject.extractTypeObject(qualifiedName);
              typeObject.setArrayDimension(
                  typeObject.getArrayDimension() + fragment.getExtraDimensions());
              FieldObject fieldObject =
                  new FieldObject(typeObject, fragment.getName().getIdentifier());
              fieldObject.setClassName(classObject.getName());
              fieldObject.setVariableDeclarationFragment(fragment);

              int fieldModifiers = fieldDeclaration.getModifiers();
              if ((fieldModifiers & Modifier.PUBLIC) != 0) fieldObject.setAccess(Access.PUBLIC);
              else if ((fieldModifiers & Modifier.PROTECTED) != 0)
                fieldObject.setAccess(Access.PROTECTED);
              else if ((fieldModifiers & Modifier.PRIVATE) != 0)
                fieldObject.setAccess(Access.PRIVATE);
              else fieldObject.setAccess(Access.NONE);

              if ((fieldModifiers & Modifier.STATIC) != 0) fieldObject.setStatic(true);

              classObject.addField(fieldObject);
            }
          }

          MethodDeclaration[] methodDeclarations = typeDeclaration.getMethods();
          for (MethodDeclaration methodDeclaration : methodDeclarations) {
            String methodName = methodDeclaration.getName().getIdentifier();
            final ConstructorObject constructorObject = new ConstructorObject();
            constructorObject.setMethodDeclaration(methodDeclaration);
            constructorObject.setName(methodName);
            constructorObject.setClassName(classObject.getName());

            int methodModifiers = methodDeclaration.getModifiers();
            if ((methodModifiers & Modifier.PUBLIC) != 0)
              constructorObject.setAccess(Access.PUBLIC);
            else if ((methodModifiers & Modifier.PROTECTED) != 0)
              constructorObject.setAccess(Access.PROTECTED);
            else if ((methodModifiers & Modifier.PRIVATE) != 0)
              constructorObject.setAccess(Access.PRIVATE);
            else constructorObject.setAccess(Access.NONE);

            List<SingleVariableDeclaration> parameters = methodDeclaration.parameters();
            for (SingleVariableDeclaration parameter : parameters) {
              Type parameterType = parameter.getType();
              ITypeBinding binding = parameterType.resolveBinding();
              String qualifiedName = binding.getQualifiedName();
              TypeObject typeObject = TypeObject.extractTypeObject(qualifiedName);
              typeObject.setArrayDimension(
                  typeObject.getArrayDimension() + parameter.getExtraDimensions());
              if (parameter.isVarargs()) {
                typeObject.setArrayDimension(1);
              }
              ParameterObject parameterObject =
                  new ParameterObject(typeObject, parameter.getName().getIdentifier());
              parameterObject.setSingleVariableDeclaration(parameter);
              constructorObject.addParameter(parameterObject);
            }

            Block methodBody = methodDeclaration.getBody();
            if (methodBody != null) {
              MethodBodyObject methodBodyObject = new MethodBodyObject(methodBody);
              constructorObject.setMethodBody(methodBodyObject);
            }

            if (methodDeclaration.isConstructor()) {
              classObject.addConstructor(constructorObject);
            } else {
              MethodObject methodObject = new MethodObject(constructorObject);
              List<IExtendedModifier> extendedModifiers = methodDeclaration.modifiers();
              for (IExtendedModifier extendedModifier : extendedModifiers) {
                if (extendedModifier.isAnnotation()) {
                  Annotation annotation = (Annotation) extendedModifier;
                  if (annotation.getTypeName().getFullyQualifiedName().equals("Test")) {
                    methodObject.setTestAnnotation(true);
                    break;
                  }
                }
              }
              Type returnType = methodDeclaration.getReturnType2();
              ITypeBinding binding = returnType.resolveBinding();
              String qualifiedName = binding.getQualifiedName();
              TypeObject typeObject = TypeObject.extractTypeObject(qualifiedName);
              methodObject.setReturnType(typeObject);

              if ((methodModifiers & Modifier.ABSTRACT) != 0) methodObject.setAbstract(true);
              if ((methodModifiers & Modifier.STATIC) != 0) methodObject.setStatic(true);
              if ((methodModifiers & Modifier.SYNCHRONIZED) != 0)
                methodObject.setSynchronized(true);
              if ((methodModifiers & Modifier.NATIVE) != 0) methodObject.setNative(true);

              classObject.addMethod(methodObject);
              FieldInstructionObject fieldInstruction = methodObject.isGetter();
              if (fieldInstruction != null)
                systemObject.addGetter(methodObject.generateMethodInvocation(), fieldInstruction);
              fieldInstruction = methodObject.isSetter();
              if (fieldInstruction != null)
                systemObject.addSetter(methodObject.generateMethodInvocation(), fieldInstruction);
              fieldInstruction = methodObject.isCollectionAdder();
              if (fieldInstruction != null)
                systemObject.addCollectionAdder(
                    methodObject.generateMethodInvocation(), fieldInstruction);
              MethodInvocationObject methodInvocation = methodObject.isDelegate();
              if (methodInvocation != null)
                systemObject.addDelegate(methodObject.generateMethodInvocation(), methodInvocation);
            }
          }
          classObjects.add(classObject);
        }
      }
    }
    return classObjects;
  }
Пример #5
0
  /**
   * @param field
   * @param subFieldElements
   */
  private void setSubFields(FieldObject field, List<Element> subFieldElements) {
    List<FieldObject> subFields = new ArrayList<FieldObject>();
    fields.put(field.getType(), subFields);
    for (Element subElement : subFieldElements) {
      FieldObject subField = new FieldObject();
      subField.setType(subElement.getAttributeValue("type"));
      subField.setClientType(subElement.getAttributeValue("clientType"));
      if (StringUtils.isEmpty(subField.getClientType())) {
        subField.setClientType(GeneratorHelper.getClientClassName(subField.getType()) + "Data");
      }
      subField.setSmallName(subElement.getAttributeValue("name"));
      subField.setComment(subElement.getAttributeValue("comment"));
      if (subElement.getAttributeValue("list") != null) {
        subField.setList(subElement.getAttributeValue("list").equals("true") ? true : false);
        field.setHasListField(true);
      }
      subFields.add(subField);
      List<Element> subsubFieldElements = subElement.getChildren("field", NAME_SPACE);
      if (subsubFieldElements.size() > 0) {
        this.setSubFields(subField, subsubFieldElements);
      }

      // 如果不是系统定义的类型则说明是子消息
      if (!new ArrayListWrapper(sysTypes).contains(subField.getType())) {
        subField.setIsNewType(true);
        if (subField.getType().indexOf("_") > 0) {
          subField.setType(GeneratorHelper.generateServerClassName(subField.getType()));
        }
      }
    }
    field.setSubFields(subFields);
    // 如果配置了子节点,而且类型中不存在包名,则说明是新定义的类型
    if (field.getType().indexOf(".") == -1) {
      field.setNeedCreateType(true);
    }
  }
Пример #6
0
  /**
   * 设置消息对象的字段
   *
   * @param msgObj
   * @param msgElement
   */
  private void setMsgObjFields(
      MessageObject msgObj, List fElements, boolean isClient, boolean isCppClient) {
    for (Iterator j = fElements.iterator(); j.hasNext(); ) {
      Element fElement = (Element) j.next();
      FieldObject field = new FieldObject();
      field.setType(fElement.getAttributeValue("type"));
      field.setClientType(fElement.getAttributeValue("clientType"));
      if (StringUtils.isEmpty(field.getClientType())) {
        field.setClientType(GeneratorHelper.getClientClassName(field.getType()) + "Data");
      }
      field.setSmallName(fElement.getAttributeValue("name"));
      field.setComment(fElement.getAttributeValue("comment"));

      if (fElement.getAttribute("defaultValue") != null) {
        String defaultValue = fElement.getAttributeValue("defaultValue");
        if (StringUtils.isEmpty(defaultValue)) {
          if (!TYPE_STRING.equals(field.getType())) {
            defaultValue = "0";
          } else {
            defaultValue = "";
          }
        }
        if (TYPE_STRING.equals(field.getType())) {
          defaultValue = "\"" + defaultValue + "\"";
        }
        field.setDefaultValue("=" + defaultValue);
      } else {
        field.setDefaultValue("");
      }

      List<Element> subFieldElements = fElement.getChildren("field", NAME_SPACE);
      if (fElement.getAttributeValue("bytes") != null) {
        field.setBytes(fElement.getAttributeValue("bytes").equals("true") ? true : false);
      }
      if (fElement.getAttributeValue("list") != null) {
        field.setList(fElement.getAttributeValue("list").equals("true") ? true : false);
        msgObj.setHasListField(true);
      }

      boolean isSubMsg = "true".equalsIgnoreCase(fElement.getAttributeValue("subMsg"));
      field.setSubMsg(isSubMsg);
      if (isSubMsg) {
        field.setSubMsgType(GeneratorHelper.generateServerClassName(field.getType()));
        msgObj.setListMsg(true);
        if (isCppClient) {
          field.setList(true);
          msgObj.setHasListField(true);
          field.setType("_LZOBEX_" + field.getType());
        }
      }

      // 如果不是系统定义的类型则说明是子消息
      if (!new ArrayListWrapper(sysTypes).contains(field.getType())) {
        if (!isCppClient || !field.isSubMsg()) {
          field.setIsNewType(true);
          if (!isClient && field.getType().indexOf("_") > 0) {
            field.setType(GeneratorHelper.generateServerClassName(field.getType()));
          }
        }
      }

      if (subFieldElements.size() > 0) {
        this.setSubFields(field, subFieldElements);
      } else {
        if (isClient && field.getIsNewType()) { // 客户端生成消息的时候要为其补全
          field.setSubFields(fields.get(field.getType()));
        }
        if (!isClient && field.getList() && field.getIsNewType()) {
          String type = field.getType();
          field.setSubFields(msgs.get(type).getFields());
        }
      }
      if (field.isSubMsg() && !isCppClient) {
        msgObj.addSubMsg(field);
      } else {
        msgObj.addField(field);
      }
    }
  }
Пример #7
0
  /**
   * 生成客户端数据模型
   *
   * @param messages
   */
  private void createClientModel(List<MessageObject> messages, String module) {
    Map<String, FieldObject> newTypeFields = new HashMap<String, FieldObject>();
    for (MessageObject msgObj : messages) {
      List<FieldObject> fields = msgObj.getFields();
      for (FieldObject fieldObject : fields) {
        if (fieldObject.getIsNewType()) {
          // 先遍历它的子类型
          for (FieldObject subfieldObject : fieldObject.getSubFields()) {
            if (subfieldObject.getIsNewType()) {
              // 先遍历子类型的子类型
              for (FieldObject subsubfieldObject : subfieldObject.getSubFields()) {
                if (subsubfieldObject.getIsNewType()) {

                  // 先遍历子类型的子类型
                  for (FieldObject sssfieldObject : subsubfieldObject.getSubFields()) {
                    if (sssfieldObject.getIsNewType()) {

                      sssfieldObject.setType(sssfieldObject.getClientType());
                      if (sssfieldObject.getClientType().contains(".")) {
                        sssfieldObject.setType(
                            GeneratorHelper.getClientClassName(sssfieldObject.getType()));
                        continue;
                      }
                      newTypeFields.put(sssfieldObject.getClientType(), sssfieldObject);
                    }
                  }

                  subsubfieldObject.setType(subsubfieldObject.getClientType());
                  if (subsubfieldObject.getClientType().contains(".")) {
                    subsubfieldObject.setType(
                        GeneratorHelper.getClientClassName(subsubfieldObject.getType()));
                    continue;
                  }
                  newTypeFields.put(subsubfieldObject.getClientType(), subsubfieldObject);
                }
              }
              //
              subfieldObject.setType(subfieldObject.getClientType());
              if (subfieldObject.getClientType().contains(".")) {
                subfieldObject.setType(
                    GeneratorHelper.getClientClassName(subfieldObject.getType()));
                continue;
              }
              newTypeFields.put(subfieldObject.getClientType(), subfieldObject);
            }
          }
          fieldObject.setType(fieldObject.getClientType());
          if (fieldObject.getClientType().contains(".")) {
            fieldObject.setType(GeneratorHelper.getClientClassName(fieldObject.getType()));
            continue;
          }
          newTypeFields.put(fieldObject.getClientType(), fieldObject);
        }
      }
    }
    for (FieldObject fieldObject : newTypeFields.values()) {
      VelocityContext context = new VelocityContext();
      context.put("modulename", module);
      context.put("model", fieldObject);
      String outputFilePath;
      if (replaceDirectly) {
        outputFilePath = dataPath + fieldObject.getType() + ".as";
      } else {
        outputFilePath =
            clientRootPath
                + File.separator
                + module
                + File.separator
                + "data"
                + File.separator
                + fieldObject.getType()
                + ".as";
      }
      try {
        GeneratorHelper.generate(context, clientModelTemplate, outputFilePath);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
Пример #8
0
  public void writeObject(FieldObject fieldObject) throws IOException {
    obj_nr++;
    int HX = 0;
    int HY = 0;
    int LX = 999;
    int LY = 999;

    proNumber = 6;

    Iterator<Point> getOffsetIt = fieldObject.getPoints().iterator();
    // GET OFFSET

    BufferedImage bufImgObj = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D gObject = (Graphics2D) bufImgObj.getGraphics();
    gObject.setColor(fieldObject.getAvgColor());
    while (getOffsetIt.hasNext()) {
      Point point = getOffsetIt.next();
      int x = point.getX();
      int y = point.getY();

      if (x > HX) {
        HX = x;
      }
      if (y > HY) {
        HY = y;
      }
      if (x < LX) {
        LX = x;
      }
      if (y < LY) {
        LY = y;
      }
      // gObject.setBackground(Color.green);
      gObject.drawLine(point.getX(), point.getY(), point.getX(), point.getY());
    }

    // ERSTELLE SNIPPETFILE

    File fileSnippet = new File("d://snippets/snippet_" + cap_nr + "_" + obj_nr + ".png");

    // ERSTELLE OBJECTFILE
    String pathnameObject = "d://LIGA/objects/obj_" + cap_nr + "_" + obj_nr + ".png";
    File fileObject = new File(pathnameObject);

    BufferedImage bufImgSni = new BufferedImage(HX - LX, HY - LY, BufferedImage.TYPE_INT_RGB);

    // ERSTELLE GRAFIK
    Graphics2D gSnippet = (Graphics2D) bufImgSni.getGraphics();
    Iterator<Point> currentObjIt = points.iterator();

    // ERSTELLE G-BILD OBJEKT OHNE OFFSET
    while (currentObjIt.hasNext()) {
      Point p1 = currentObjIt.next();
      gSnippet.drawLine(p1.getX() - LX, p1.getY() - LY, p1.getX() - LX, p1.getY() - LY);
    }

    gSnippet.dispose();
    gObject.dispose();

    // CREATE CURRENT MATCH
    if (bufImgSni.getWidth() < 40 || bufImgSni.getHeight() < 40) {

      BufferedImage biggerSni =
          new BufferedImage(
              bufImgSni.getWidth() + 20,
              bufImgSni.getHeight() + 20,
              BufferedImage.TYPE_BYTE_BINARY);
      Graphics2D gTest = (Graphics2D) biggerSni.getGraphics();
      gTest.drawImage(bufImgSni, 0, 0, null);
      gTest.dispose();

      bufImgSni = biggerSni;
    }

    System.out.println("Checking Snippet " + obj_nr + "...");
    // ImageIO.write(bufImgSni, "png", fileSnippet);
    // currentMatch = cbo.startComparing(bufImgSni, LX, LY);

    System.out.println("-----------------------\n");

    ImageIO.write(bufImgObj, "png", fileObject);
  }
  private ClassObject parseBytecode(File file) {
    final ClassObject co = new ClassObject();
    try {
      FileInputStream fin = new FileInputStream(file);
      ClassReader cr = new ClassReader(new DataInputStream(fin));
      ClassNode cn = new ClassNode();
      cr.accept(cn, ClassReader.SKIP_DEBUG);

      String name = cn.name;
      co.setName(name.replaceAll("/", "."));

      if ((cn.access & Opcodes.ACC_INTERFACE) != 0) co.setInterface(true);
      else if ((cn.access & Opcodes.ACC_ABSTRACT) != 0) co.setAbstract(true);

      if ((cn.access & Opcodes.ACC_PUBLIC) != 0) co.setAccess(Access.PUBLIC);
      else if ((cn.access & Opcodes.ACC_PROTECTED) != 0) co.setAccess(Access.PROTECTED);
      else if ((cn.access & Opcodes.ACC_PRIVATE) != 0) co.setAccess(Access.PRIVATE);
      if ((cn.access & Opcodes.ACC_STATIC) != 0) co.setStatic(true);

      String superClass = cn.superName;
      co.setSuperclass(superClass.replaceAll("/", "."));

      List interfaces = cn.interfaces;
      for (Object anInterface : interfaces) {
        String interfaceString = (String) anInterface;
        co.addInterface(interfaceString.replaceAll("/", "."));
      }

      List fields = cn.fields;
      for (Object field : fields) {
        FieldNode fieldNode = (FieldNode) field;
        Type fieldType = Type.getType(fieldNode.desc);
        TypeObject typeObject = new TypeObject(fieldType.getClassName());
        if (fieldNode.signature != null) {
          TraceSignatureVisitor v = new TraceSignatureVisitor(ClassReader.SKIP_DEBUG);
          SignatureReader r = new SignatureReader(fieldNode.signature);
          r.accept(v);
          String declaration = v.getDeclaration();
          if (declaration.contains("<") && declaration.contains(">"))
            typeObject.setGeneric(
                declaration.substring(declaration.indexOf("<") + 1, declaration.lastIndexOf(">")));
        }
        FieldObject fo = new FieldObject(typeObject, fieldNode.name);

        if ((fieldNode.access & Opcodes.ACC_PUBLIC) != 0) fo.setAccess(Access.PUBLIC);
        else if ((fieldNode.access & Opcodes.ACC_PROTECTED) != 0) fo.setAccess(Access.PROTECTED);
        else if ((fieldNode.access & Opcodes.ACC_PRIVATE) != 0) fo.setAccess(Access.PRIVATE);
        if ((fieldNode.access & Opcodes.ACC_STATIC) != 0) fo.setStatic(true);
        co.addField(fo);
      }

      List methods = cn.methods;
      for (Object method : methods) {
        MethodNode methodNode = (MethodNode) method;

        final ConstructorObject constructorObject = new ConstructorObject();

        if ((methodNode.access & Opcodes.ACC_PUBLIC) != 0)
          constructorObject.setAccess(Access.PUBLIC);
        else if ((methodNode.access & Opcodes.ACC_PROTECTED) != 0)
          constructorObject.setAccess(Access.PROTECTED);
        else if ((methodNode.access & Opcodes.ACC_PRIVATE) != 0)
          constructorObject.setAccess(Access.PRIVATE);

        if (methodNode.signature != null) {
          TraceSignatureVisitor v = new TraceSignatureVisitor(ClassReader.SKIP_DEBUG);
          SignatureReader r = new SignatureReader(methodNode.signature);
          r.accept(v);
          String declaration = v.getDeclaration();
          String temp = declaration;
          if (temp.startsWith("(")) temp = temp.substring(1, temp.length());
          if (temp.endsWith("")) temp = temp.substring(0, temp.length() - 1);
          if (!temp.equals("")) {
            ParameterAnalyzer analyzer = new ParameterAnalyzer(temp);
            for (String token : analyzer.getParameters()) {
              if (token.contains("<") && token.contains(">")) {
                TypeObject typeObject = new TypeObject(token.substring(0, token.indexOf("<")));
                typeObject.setGeneric(
                    token.substring(token.indexOf("<") + 1, token.lastIndexOf(">")));
                constructorObject.addParameter(typeObject);
              } else {
                constructorObject.addParameter(new TypeObject(token));
              }
            }
          }
        } else {
          Type[] argumentTypes = Type.getArgumentTypes(methodNode.desc);
          for (Type argumentType : argumentTypes)
            constructorObject.addParameter(new TypeObject(argumentType.getClassName()));
        }
        if (methodNode.instructions.size() > 0) {
          Map<String, Integer> labelIndexMap = new HashMap<String, Integer>();
          List<LoopObject> activeLoops = new ArrayList<LoopObject>();

          Iterator insnIt = methodNode.instructions.iterator();
          int index = 0;
          while (insnIt.hasNext()) {
            AbstractInsnNode ainsn = (AbstractInsnNode) insnIt.next();

            if (ainsn instanceof LabelNode) {
              LabelNode labelNode = (LabelNode) ainsn;
              Label label = labelNode.getLabel();
              LoopObject loop = new LoopObject(label.toString());
              activeLoops.add(loop);
              labelIndexMap.put(label.toString(), index);
            }

            if (ainsn instanceof JumpInsnNode) {
              JumpInsnNode jumpNode = (JumpInsnNode) ainsn;
              Label label = jumpNode.label.getLabel();
              if (labelIndexMap.containsKey(label.toString())) {
                LoopObject matchingLoop = null;
                for (LoopObject loop : activeLoops) {
                  if (loop.getLabel().equals(label.toString())) {
                    matchingLoop = loop;
                    break;
                  }
                }
                if (matchingLoop != null) {
                  constructorObject.addLoop(matchingLoop);
                  activeLoops.remove(matchingLoop);
                }
              }
            }

            if (ainsn instanceof FieldInsnNode) {
              FieldInsnNode fieldInsnNode = (FieldInsnNode) ainsn;
              Type fieldType = Type.getType(fieldInsnNode.desc);
              FieldInstructionObject fieldObject =
                  new FieldInstructionObject(
                      fieldInsnNode.owner.replaceAll("/", "."),
                      fieldType.getClassName(),
                      fieldInsnNode.name);
              constructorObject.addFieldInstruction(fieldObject);
              for (LoopObject loop : activeLoops) {
                loop.addFieldInstruction(fieldObject);
              }
            }

            if ((ainsn.getOpcode() == Opcodes.INVOKEVIRTUAL)
                || (ainsn.getOpcode() == Opcodes.INVOKESTATIC)
                || (ainsn.getOpcode() == Opcodes.INVOKESPECIAL)
                || (ainsn.getOpcode() == Opcodes.INVOKEINTERFACE)) {

              MethodInsnNode minsn = (MethodInsnNode) ainsn;
              MethodInvocationObject mio =
                  new MethodInvocationObject(
                      minsn.owner.replaceAll("/", "."),
                      minsn.name,
                      Type.getReturnType(minsn.desc).getClassName());
              Type[] argTypes = Type.getArgumentTypes(minsn.desc);
              for (Type argType : argTypes) mio.addParameter(argType.getClassName());

              constructorObject.addMethodInvocation(mio);
              for (LoopObject loop : activeLoops) {
                loop.addMethodInvocation(mio);
              }
            }

            if ((ainsn.getOpcode() == Opcodes.NEW) || (ainsn.getOpcode() == Opcodes.ANEWARRAY)) {

              TypeInsnNode tinsn = (TypeInsnNode) ainsn;
              constructorObject.addObjectInstantiation(tinsn.desc.replaceAll("/", "."));
            }
            index++;
          }
        }

        if (methodNode.name.equals("<init>")) {
          constructorObject.setName(co.getName());
          co.addConstructor(constructorObject);
        } else {
          Type returnType = Type.getReturnType(methodNode.desc);
          constructorObject.setName(methodNode.name);
          MethodObject methodObject = new MethodObject(constructorObject);
          TypeObject typeObject = new TypeObject(returnType.getClassName());
          if (methodNode.signature != null) {
            TraceSignatureVisitor v = new TraceSignatureVisitor(ClassReader.SKIP_DEBUG);
            SignatureReader r = new SignatureReader(methodNode.signature);
            r.accept(v);
            String genericReturnType = v.getReturnType();
            if (genericReturnType.contains("<") && genericReturnType.contains(">"))
              typeObject.setGeneric(
                  genericReturnType.substring(
                      genericReturnType.indexOf("<") + 1, genericReturnType.lastIndexOf(">")));
          }

          methodObject.setReturnType(typeObject);
          methodObject.setClassName(co.getName());
          if ((methodNode.access & Opcodes.ACC_ABSTRACT) != 0) methodObject.setAbstract(true);
          if ((methodNode.access & Opcodes.ACC_STATIC) != 0) methodObject.setStatic(true);
          co.addMethod(methodObject);
        }
      }
      fin.close();
    } catch (FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }

    return co;
  }