grib/src/main/java/ucar/nc2/grib/grib1/tables/FnmocTables.java
@Nullable
  private HashMap<Integer, VertCoordType> readFnmocTable3(String path) {
    try (InputStream is = GribResourceReader.getInputStream(path)) {
      SAXBuilder builder = new SAXBuilder();
      org.jdom2.Document doc = builder.build(is);
      Element root = doc.getRootElement();

      HashMap<Integer, VertCoordType> result = new HashMap<>(200);
      Element fnmocTable = root.getChild("fnmocTable");
      List<Element> params = fnmocTable.getChildren("entry");
      for (Element elem1 : params) {
        int code = Integer.parseInt(elem1.getChildText("grib1Id"));
        if (code < 129) continue;
        String desc = elem1.getChildText("description");
        String abbrev = elem1.getChildText("name");
        String units = elem1.getChildText("units");
        if (units == null) units = (code == 219) ? "Pa" : "";
        String datum = elem1.getChildText("datum");
        boolean isLayer = elem1.getChild("isLayer") != null;
        boolean isPositiveUp = elem1.getChild("isPositiveUp")  != null;
        VertCoordType lt = new VertCoordType(code, desc, abbrev, units, datum, isPositiveUp, isLayer);
        result.put(code, lt);
      }

      return result;  // all at once - thread safe

    } catch (IOException | JDOMException e) {
      logger.error("Cant read FnmocTable3 = " + path, e);
      return null;
    }
  }
@Nullable
  private HashMap<Integer, VertCoordType> readFnmocTable3(String path) {
    try (InputStream is = GribResourceReader.getInputStream(path)) {
      SAXBuilder builder = new SAXBuilder();
      org.jdom2.Document doc = builder.build(is);
      Element root = doc.getRootElement();

      HashMap<Integer, VertCoordType> result = new HashMap<>(200);
      Element fnmocTable = root.getChild("fnmocTable");
      List<Element> params = fnmocTable.getChildren("entry");
      for (Element elem1 : params) {
        int code = Integer.parseInt(elem1.getChildText("grib1Id"));
        if (code < 129) continue;
        String desc = elem1.getChildText("description");
        String abbrev = elem1.getChildText("name");
        String units = elem1.getChildText("units");
        if (units == null) units = (code == 219) ? "Pa" : "";
        String datum = elem1.getChildText("datum");
        boolean isLayer = elem1.getChild("isLayer") != null;
        boolean isPositiveUp = elem1.getChild("isPositiveUp")  != null;
        VertCoordType lt = new VertCoordType(code, desc, abbrev, units, datum, isPositiveUp, isLayer);
        result.put(code, lt);
      }

      return result;  // all at once - thread safe

    } catch (IOException | JDOMException e) {
      logger.error("Cant read FnmocTable3 = " + path, e);
      return null;
    }
  }
@ Nullable private HashMap < Integer , VertCoordType > readFnmocTable3 ( String path ) { try ( InputStream is = GribResourceReader . getInputStream ( path ) ) { SAXBuilder builder = new SAXBuilder ( ) ; org . jdom2 . Document doc = builder . build ( is ) ; Element root = doc . getRootElement ( ) ; HashMap < Integer , VertCoordType > result = new HashMap <> ( 200 ) ; Element fnmocTable = root . getChild ( "fnmocTable" ) ; List < Element > params = fnmocTable . getChildren ( "entry" ) ; for ( Element elem1 : params ) { int code = Integer . parseInt ( elem1 . getChildText ( "grib1Id" ) ) ; if ( code < 129 ) continue ; String desc = elem1 . getChildText ( "description" ) ; String abbrev = elem1 . getChildText ( "name" ) ; String units = elem1 . getChildText ( "units" ) ; if ( units == null ) units = ( code == 219 ) ? "Pa" : "" ; String datum = elem1 . getChildText ( "datum" ) ; boolean isLayer = elem1 . getChild ( "isLayer" ) != null ; boolean isPositiveUp = elem1 . getChild ( "isPositiveUp" ) != null ; VertCoordType lt = new VertCoordType ( code , desc , abbrev , units , datum , isPositiveUp , isLayer ) ; result . put ( code , lt ) ; } return result ; // all at once - thread safe
 } catch ( IOException | JDOMException e ) { logger . error ( "Cant read FnmocTable3 = " + path , e ) ; return null ; } }
/*
<entry>
<grib1Id>222</grib1Id>
<fnmocId>mid_cld</fnmocId>
<name>mid_cld</name>
<description>middle cloud layer</description>
<status>deprecated</status>
</entry>

<fnmocTable>
<entry>
<grib1Id>001</grib1Id>
<fnmocId>surface</fnmocId>
<name>surface</name>
<description>ground or water surface (the atmosphere's lower boundary, land/sea surface)</description>
<status>current</status>
</entry>
/ * <entry > <grib1Id > 222< / grib1Id > <fnmocId > mid_cld< / fnmocId > <name > mid_cld< / name > <description > middle cloud layer< / description > <status > deprecated< / status > < / entry >