cdm/src/main/java/ucar/nc2/util/CompareNetcdf2.java
private boolean compareGroups(Group org, Group copy, ObjFilter filter) {
    if (showCompare) f.format("compare Group %s to %s %n", org.getShortName(), copy.getShortName());
    boolean ok = true;

    if (!org.getShortName().equals(copy.getShortName())) {
      f.format(" ** names are different %s != %s %n", org.getShortName(), copy.getShortName());
      ok = false;
    }

    // dimensions
    ok &= checkDimensions(org.getDimensions(), copy.getDimensions());
    ok &= checkDimensions(copy.getDimensions(), org.getDimensions());

    // attributes
    ok &= checkAttributes(null, org.getAttributes(), copy.getAttributes(), filter);

    // enums
    ok &= checkEnums(org, copy);

    // variables
    // cant use object equality, just match on short name
    for (Variable orgV : org.getVariables()) {
      Variable copyVar = copy.findVariable(orgV.getShortName());
      if (copyVar == null) {
        f.format(" ** cant find variable %s in 2nd file%n", orgV.getFullName());
        ok = false;
      } else {
        ok &= compareVariables(orgV, copyVar, filter, compareData, true);
      }
    }

    for (Variable copyV : copy.getVariables()) {
      Variable orgV = org.findVariable(copyV.getShortName());
      if (orgV == null) {
        f.format(" ** cant find variable %s in 1st file%n", copyV.getFullName());
        ok = false;
      }
    }

    // nested groups
    List groups = new ArrayList();
    String name = org.isRoot() ? "root" : org.getFullName();
    ok &= checkAll(name, org.getGroups(), copy.getGroups(), groups);
    for (int i = 0; i < groups.size(); i += 2) {
      Group orgGroup = (Group) groups.get(i);
      Group copyGroup = (Group) groups.get(i + 1);
      ok &= compareGroups(orgGroup, copyGroup, filter);
    }

    return ok;
  }
private boolean compareGroups(Group org, Group copy, ObjFilter filter) {
    if (showCompare) f.format("compare Group %s to %s %n", org.getShortName(), copy.getShortName());
    boolean ok = true;

    if (!org.getShortName().equals(copy.getShortName())) {
      f.format(" ** names are different %s != %s %n", org.getShortName(), copy.getShortName());
      ok = false;
    }

    // dimensions
    ok &= checkDimensions(org.getDimensions(), copy.getDimensions());
    ok &= checkDimensions(copy.getDimensions(), org.getDimensions());

    // attributes
    ok &= checkAttributes(null, org.getAttributes(), copy.getAttributes(), filter);

    // enums
    ok &= checkEnums(org, copy);

    // variables
    // cant use object equality, just match on short name
    for (Variable orgV : org.getVariables()) {
      Variable copyVar = copy.findVariable(orgV.getShortName());
      if (copyVar == null) {
        f.format(" ** cant find variable %s in 2nd file%n", orgV.getFullName());
        ok = false;
      } else {
        ok &= compareVariables(orgV, copyVar, filter, compareData, true);
      }
    }

    for (Variable copyV : copy.getVariables()) {
      Variable orgV = org.findVariable(copyV.getShortName());
      if (orgV == null) {
        f.format(" ** cant find variable %s in 1st file%n", copyV.getFullName());
        ok = false;
      }
    }

    // nested groups
    List groups = new ArrayList();
    String name = org.isRoot() ? "root" : org.getFullName();
    ok &= checkAll(name, org.getGroups(), copy.getGroups(), groups);
    for (int i = 0; i < groups.size(); i += 2) {
      Group orgGroup = (Group) groups.get(i);
      Group copyGroup = (Group) groups.get(i + 1);
      ok &= compareGroups(orgGroup, copyGroup, filter);
    }

    return ok;
  }
private boolean compareGroups ( Group org , Group copy , ObjFilter filter ) { if ( showCompare ) f . format ( "compare Group %s to %s %n" , org . getShortName ( ) , copy . getShortName ( ) ) ; boolean ok = true ; if ( ! org . getShortName ( ) . equals ( copy . getShortName ( ) ) ) { f . format ( " ** names are different %s != %s %n" , org . getShortName ( ) , copy . getShortName ( ) ) ; ok = false ; } // dimensions
 ok &= checkDimensions ( org . getDimensions ( ) , copy . getDimensions ( ) ) ; ok &= checkDimensions ( copy . getDimensions ( ) , org . getDimensions ( ) ) ; // attributes
 ok &= checkAttributes ( null , org . getAttributes ( ) , copy . getAttributes ( ) , filter ) ; // enums
 ok &= checkEnums ( org , copy ) ; // variables
 // cant use object equality, just match on short name
 for ( Variable orgV : org . getVariables ( ) ) { Variable copyVar = copy . findVariable ( orgV . getShortName ( ) ) ; if ( copyVar == null ) { f . format ( " ** cant find variable %s in 2nd file%n" , orgV . getFullName ( ) ) ; ok = false ; } else { ok &= compareVariables ( orgV , copyVar , filter , compareData , true ) ; } } for ( Variable copyV : copy . getVariables ( ) ) { Variable orgV = org . findVariable ( copyV . getShortName ( ) ) ; if ( orgV == null ) { f . format ( " ** cant find variable %s in 1st file%n" , copyV . getFullName ( ) ) ; ok = false ; } } // nested groups
 List groups = new ArrayList ( ) ; String name = org . isRoot ( ) ? "root" : org . getFullName ( ) ; ok &= checkAll ( name , org . getGroups ( ) , copy . getGroups ( ) , groups ) ; for ( int i = 0 ; i < groups . size ( ) ; i += 2 ) { Group orgGroup = ( Group ) groups . get ( i ) ; Group copyGroup = ( Group ) groups . get ( i + 1 ) ; ok &= compareGroups ( orgGroup , copyGroup , filter ) ; } return ok ; }
/* private boolean compare(List<Dimension> dims1, List<Dimension> dims2) {
if (dims1.size() != dims2.size()) return false;
for (int i = 0; i < dims1.size(); i++) {
Dimension dim1 = dims1.get(i);
Dimension dim2 = dims2.get(i);
if (!dim1.getName().equals(dim2.getName())) return false;
if (dim1.getLength() != dim2.getLength()) return false;
}
return true;
}
/ * private boolean compare ( List<Dimension > dims1 List<Dimension > dims2 ) { if ( dims1 . size () ! = dims2 . size () ) return false ; for ( int i = 0 ; i < dims1 . size () ; i ++ ) { Dimension dim1 = dims1 . get ( i ) ; Dimension dim2 = dims2 . get ( i ) ; if ( !dim1 . getName () . equals ( dim2 . getName () )) return false ; if ( dim1 . getLength () ! = dim2 . getLength () ) return false ; } return true ; }