private static boolean schemasEqual(NeutralSchema ns1, NeutralSchema ns2) {
   if (ns1.getValidatorClass().equals(ns2.getValidatorClass())
       && ns1.getVersion().equals(ns2.getVersion())
       && ns1.getFields().size() == ns2.getFields().size()) {
     for (Entry<String, NeutralSchema> entry : ns1.getFields().entrySet()) {
       if (!ns2.getFields().containsKey(entry.getKey())) {
         return false;
       }
       if (!schemasEqual(entry.getValue(), ns2.getFields().get(entry.getKey()))) {
         return false;
       }
     }
     for (Entry<String, Object> entry : ns1.getProperties().entrySet()) {
       if (!ns2.getProperties().containsKey(entry.getKey())) {
         return false;
       }
       if (!entry
           .getValue()
           .getClass()
           .equals(ns2.getProperties().get(entry.getKey()).getClass())) {
         return false;
       }
       if (entry.getValue() instanceof List) {
         List<?> list1 = (List<?>) entry.getValue();
         List<?> list2 = (List<?>) ns2.getProperties().get(entry.getKey());
         if (!list1.containsAll(list2)) {
           return false;
         }
       } else {
         if (!entry.getValue().equals(ns2.getProperties().get(entry.getKey()))) {
           return false;
         }
       }
     }
     return true;
   } else {
     return false;
   }
 }