public JPanel createReport(ModelDiagram md) {
    umlclist.clear();
    umlulist.clear();
    umlcrudlist.clear();

    JPanel jp = new JPanel(new GridLayout(0, 2));
    ArrayList<DiagramObject> dol = md.getDiagramObjects();

    for (DiagramObject dio : dol) {
      if (dio.getClass() == UMLClass.class) {
        umlclist.add((UMLClass) dio);
      }
      if (dio.getClass() == UMLUsecase.class) {
        umlulist.add((UMLUsecase) dio);

        ArrayList<DiagramObject> rol = dio.getRelatedObjects();
        for (DiagramObject ro : rol) {
          if (ro.getClass() == UMLCRUD.class) {
            umlcrudlist.add((UMLCRUD) ro);
          }
        }
      }
    }

    JLabel jl1 = new JLabel("Total Usecases");
    JLabel jl2 = new JLabel("" + umlulist.size());
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Total Classes");
    jl2 = new JLabel("" + umlclist.size());
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Total CRUD Connections");
    jl2 = new JLabel("" + umlcrudlist.size());
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Usecase with most connections");
    jl2 = new JLabel("" + mostConnUsecase());
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Class with most Connections");
    jl2 = new JLabel("" + mostConnClass());
    jp.add(jl1);
    jp.add(jl2);

    int creates = 0, reads = 0, updates = 0, deletes = 0;
    for (UMLCRUD umlcrud : umlcrudlist) {
      if (umlcrud.getCreate()) creates++;
      if (umlcrud.getRead()) reads++;
      if (umlcrud.getUpdate()) updates++;
      if (umlcrud.getDelete()) deletes++;
    }

    jl1 = new JLabel("Total Creates");
    jl2 = new JLabel("" + creates);
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Total Reads");
    jl2 = new JLabel("" + reads);
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Total Updates");
    jl2 = new JLabel("" + updates);
    jp.add(jl1);
    jp.add(jl2);

    jl1 = new JLabel("Total Deletes");
    jl2 = new JLabel("" + deletes);
    jp.add(jl1);
    jp.add(jl2);

    return jp;
  }