public void addCategory(
      String category, String variableIdent, TypeSpecification element, TypeBody declarationType)
      throws JselException {

    ListOfCategories typeLoc = null;

    if (declarationType != null) {
      typeLoc = (ListOfCategories) allCategorizedClasses.get(declarationType.getFcn());

      // !! job: what happens with missing categories??
      if (typeLoc == null) {
        //		typeLoc = new ListOfCategories( declarationType.getFcn(  );
        //		allCategorizedClasses.put( declarationType.getFcn(), typeLoc );
      } else {

        // !! put in here (and all category constructors a complexity helper method
        typeLoc.add(
            new ArchitecturalCategory(
                ((SourceMarker) element).getSourceURL(),
                ((SourceMarker) element).getLine(),
                ((SourceMarker) element).getColumn(),
                variableIdent,
                category));
      }
    }
  }
 private void checkGetterSetter() {
   // !!
   double ratio = 0;
   Enumeration propertyEnum = allGetterSetterCounterForClasses.keys();
   while (propertyEnum.hasMoreElements()) {
     String key = (String) propertyEnum.nextElement();
     Integer numGetterSetter = (Integer) allGetterSetterCounterForClasses.get(key + GETTERSETTER);
     Integer num = (Integer) allGetterSetterCounterForClasses.get(key);
     if (numGetterSetter != null && num != null) {
       ratio =
           new Double(num.intValue()).doubleValue()
               / new Double(numGetterSetter.intValue()).doubleValue();
     } else if (numGetterSetter != null && num == null) {
       ratio = -1;
     } else if (numGetterSetter == null && num != null) {
       ratio = 1;
     }
     // System.out.println( "ยงยง " + num +" / "+ numGetterSetter + " = "+  ratio );
     if (ratio < 0.3) {
       ListOfCategories typeLoc = (ListOfCategories) allCategorizedClasses.get(key);
       if (typeLoc != null) {
         BigDecimal bg = new BigDecimal(ratio);
         addCategory(
             typeLoc,
             VALUE_OBJECT,
             "Getter/Setter Count = "
                 + numGetterSetter
                 + " Ratio: "
                 + bg.divide(new BigDecimal("1.0"), 2, BigDecimal.ROUND_HALF_UP).toString(),
             typeLoc.getSourceURL());
       }
     }
   }
 }
  /*
  	public void addCategory(String category, String variableIdent, Interface element,  TypeDefinition declarationType) {
  		ListOfCategories typeLoc = null;
  		typeLoc = (ListOfCategories) allCategorizedClasses.get(element.getFcn());
  		typeLoc.add(new ArchitecturalCategory(
  				((SourceMarker)element).getSourceURL(),
  				((SourceMarker)element).getLine(),
  				((SourceMarker)element).getColumn(),
  				 variableIdent, category));
  	}
  */
  public void addCategory(
      String category,
      String variableIdent,
      TypeSpecification element,
      TypeDefinition declarationType)
      throws JselException {
    ListOfCategories typeLoc = null;
    if (declarationType != null) {
      typeLoc = (ListOfCategories) allCategorizedClasses.get(declarationType.getFcn());

      // !! job: what happens with missing categories??
      if (typeLoc == null) {
        //		typeLoc = new ListOfCategories( declarationType.getFcn(  );
        //		allCategorizedClasses.put( declarationType.getFcn(), typeLoc );
        new Exception().printStackTrace();
      } else {
        typeLoc.add(
            new ArchitecturalCategory(
                ((SourceMarker) element).getSourceURL(),
                ((SourceMarker) element).getLine(),
                ((SourceMarker) element).getColumn(),
                variableIdent,
                category));
      }
    }
  }
  public void addCategory(String category, String variableIdent, TypeDefinition element)
      throws JselException {
    ListOfCategories typeLoc = null;
    typeLoc = (ListOfCategories) allCategorizedClasses.get(element.getFcn());

    typeLoc.add(
        new ArchitecturalCategory(
            ((SourceMarker) element).getSourceURL(),
            ((SourceMarker) element).getLine(),
            ((SourceMarker) element).getColumn(),
            variableIdent,
            category));
  }
  public void visit(Method p) {
    // !! detect Connection >> prepareCall( )

    int start = p.getAst().getFirstToken().getLine();
    int end = p.getAst().getLastToken().getLine();
    TypeBody enclosingType = p.getEnclosingType();
    final String fcn = enclosingType.getFcn();

    if (((end - start) < 3)
        && (p.getName().toString().startsWith("get") || p.getName().toString().startsWith("set"))) {
      try {
        String keyGetterSetter = fcn + GETTERSETTER;
        Integer getterCounter = (Integer) allGetterSetterCounterForClasses.get(keyGetterSetter);
        if (getterCounter == null) {
          allGetterSetterCounterForClasses.put(keyGetterSetter, new Integer(1));
          ListOfCategories typeLoc = (ListOfCategories) allCategorizedClasses.get(fcn);
          if (typeLoc != null) {
            typeLoc.setType(fcn);
          }
        } else {
          allGetterSetterCounterForClasses.put(
              keyGetterSetter, new Integer(getterCounter.intValue() + 1));
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

    } else {
      try {
        Integer getterCounter = (Integer) allGetterSetterCounterForClasses.get(fcn);
        if (getterCounter == null) {
          allGetterSetterCounterForClasses.put(fcn, new Integer(1));
          ListOfCategories typeLoc = (ListOfCategories) allCategorizedClasses.get(fcn);
          if (typeLoc != null) {
            typeLoc.setType(fcn);
          }
        } else {
          allGetterSetterCounterForClasses.put(fcn, new Integer(getterCounter.intValue() + 1));
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  private void compressClassesToPackageLevel() {

    Enumeration classesEnum = this.allCategorizedClasses.keys();
    while (classesEnum.hasMoreElements()) {
      String key = (String) classesEnum.nextElement();
      ListOfCategories loc = (ListOfCategories) allCategorizedClasses.get(key);

      ListOfPackageCategories lopc =
          (ListOfPackageCategories)
              this.allCategorizedPackages.get(ListOfPackageCategories.getWithClassFcn(key));

      if (loc.size() == 0) {
        ArchitecturalCategoryPackage pnac =
            (ArchitecturalCategoryPackage) lopc.get("NOT CATEGORIZED");
        if (pnac != null) {
          pnac.occurance++;
        } else {
          // logger.error(" No ArchitecturalCategory for <NOT CATEGORIZED> initialized. ");
        }
      }

      for (int i = 0; i < loc.size(); i++) {
        try {
          ArchitecturalCategory ac = (ArchitecturalCategory) loc.elementAt(i);
          // System.out.println ("*** " +ac.categoryType );
          ArchitecturalCategoryPackage pac = lopc.get(ac.categoryType);
          if (pac == null) {
            lopc.put(
                ac.categoryType,
                new ArchitecturalCategoryPackage(key, ac.categoryType, ac.source_url));
          } else {
            pac.occurance++;
          }
        } catch (RuntimeException e) {
          // TODO Auto-generated catch block
        }
      }
    }
  }
 /*
 	public void addCategory(ListOfCategories typeLoc, String category, String variableIdent, LanguageElement element) {
 		try {
 			typeLoc.add(new ArchitecturalCategory(
 					((SourceMarker)element).getSourceURL(),
 					((SourceMarker)element).getLine(),
 					((SourceMarker)element).getColumn(),
 					 variableIdent, category));
 		} catch (Exception e) {
 			context.warn(element, e);
 		}
 	}
 */
 public void addCategory(
     ListOfCategories typeLoc, String category, String variableIdent, String fcn) {
   typeLoc.add(new ArchitecturalCategory(fcn, 0, 0, variableIdent, category));
 }