/**
  * Returns a visibility String either for a VisibilityKind, but also for a model element, because
  * if it is a Feature, then the tag 'src_visibility' is to be taken into account for generating
  * language dependent visibilities.
  *
  * @param o the object which may be a VisibilityKind or a ModelElelement
  * @return the generated visibility string
  */
 static String generateVisibility(Object o) {
   if (Model.getFacade().isAFeature(o)) {
     // TODO: The src_visibility tag doesn't appear to be created
     // anywhere by ArgoUML currently
     Object tv = Model.getFacade().getTaggedValue(o, "src_visibility");
     if (tv != null) {
       Object tvValue = Model.getFacade().getValue(tv);
       /* Not all taggedvalues are string - see issue 4322: */
       if (tvValue instanceof String) {
         String tagged = (String) tvValue;
         if (tagged != null) {
           if (tagged.trim().equals("")
               || tagged.trim().toLowerCase().equals("package")
               || tagged.trim().toLowerCase().equals("default")) {
             return "";
           }
           return tagged + " ";
         }
       }
     }
   }
   if (Model.getFacade().isAModelElement(o)) {
     if (Model.getFacade().isPublic(o)) {
       return "public ";
     }
     if (Model.getFacade().isPrivate(o)) {
       return "private ";
     }
     if (Model.getFacade().isProtected(o)) {
       return "protected ";
     }
     if (Model.getFacade().isPackage(o)) {
       return "";
     }
   }
   if (Model.getFacade().isAVisibilityKind(o)) {
     if (Model.getVisibilityKind().getPublic().equals(o)) {
       return "public ";
     }
     if (Model.getVisibilityKind().getPrivate().equals(o)) {
       return "private ";
     }
     if (Model.getVisibilityKind().getProtected().equals(o)) {
       return "protected ";
     }
     if (Model.getVisibilityKind().getPackage().equals(o)) {
       return "";
     }
   }
   return "";
 }
 /*
  * @see org.argouml.uml.cognitive.critics.CrUML#predicate2(
  *      java.lang.Object, org.argouml.cognitive.Designer)
  */
 public boolean predicate2(Object dm, Designer dsgr) {
   if (!(Model.getFacade().isAInterface(dm))) {
     return NO_PROBLEM;
   }
   Object inf = dm;
   Collection bf = Model.getFacade().getFeatures(inf);
   if (bf == null) {
     return NO_PROBLEM;
   }
   Iterator features = bf.iterator();
   while (features.hasNext()) {
     Object f = features.next();
     if (Model.getFacade().getVisibility(f) == null) {
       return NO_PROBLEM;
     }
     if (!Model.getFacade().getVisibility(f).equals(Model.getVisibilityKind().getPublic())) {
       return PROBLEM_FOUND;
     }
   }
   return NO_PROBLEM;
 }