protected ThreddsMetadata.MetadataOther readMetadata(Map<String,Object> flds, DatasetBuilder dataset, Element mdataElement) {
    // there are 6 cases to deal with: threddsNamespace vs not & inline vs Xlink & (if thredds) inherited or not
    Namespace namespace;
    List inlineElements = mdataElement.getChildren();
    if (inlineElements.size() > 0) {
      // look at the namespace of the children, if they exist
      namespace = ((Element) inlineElements.get(0)).getNamespace();
    }
    else {
      namespace = mdataElement.getNamespace(); // will be thredds
    }

    String mtype = mdataElement.getAttributeValue("metadataType");
    String href = mdataElement.getAttributeValue("href", Catalog.xlinkNS);
    String title = mdataElement.getAttributeValue("title", Catalog.xlinkNS);
    String inheritedS = mdataElement.getAttributeValue("inherited");
    boolean inherited = (inheritedS != null) && inheritedS.equalsIgnoreCase("true");

    boolean isThreddsNamespace = ((mtype == null) || mtype.equalsIgnoreCase("THREDDS")) && namespace.getURI().equals(Catalog.CATALOG_NAMESPACE_10);

    // the case where its not ThreddsMetadata
    if (!isThreddsNamespace) {
      if (inlineElements.size() > 0) {
        // just hold onto the jdom elements as the "content"
         return new ThreddsMetadata.MetadataOther( mtype, namespace.getURI(), namespace.getPrefix(), inherited, mdataElement);

      }
      else {
        // otherwise it must be an Xlink
        return new ThreddsMetadata.MetadataOther(href, title, mtype, namespace.getURI(), namespace.getPrefix(), inherited);
      }
    }

    // the case where its ThreddsMetadata
    Map<String,Object> useFlds;
    if (inherited) {
      // the case where its inherited ThreddsMetadata: gonna put stuff in the tmi.
      ThreddsMetadata tmi = (ThreddsMetadata) dataset.get(Dataset.ThreddsMetadataInheritable);
      if (tmi == null) {
        tmi = new ThreddsMetadata();
        dataset.put(Dataset.ThreddsMetadataInheritable, tmi);
      }
      useFlds = tmi.getFlds();

    }
    else {
      // the case where its non-inherited ThreddsMetadata: gonna put stuff directly into the dataset
      useFlds = flds;
    }
    readThreddsMetadataGroup(useFlds, dataset, mdataElement);

    // also need to capture any XLinks. see http://www.unidata.ucar.edu/software/thredds/v4.6/tds/catalog/InvCatalogSpec.html#metadataElement
    // in this case we just suck it in as if it was inline
    if (href != null) {
      try {
        URI xlinkUri = Catalog.resolveUri(baseURI, href);
        Element remoteMdata = readMetadataFromUrl(xlinkUri);
        return readMetadata(useFlds, dataset, remoteMdata);
      }
      catch (Exception ioe) {
        errlog.format("Cant read in referenced metadata %s err=%s%n", href, ioe.getMessage());
        logger.debug("Can't read in referenced metadata {} err={}}", href, ioe.getMessage());
      }

    }
    return null;  // ThreddsMetadata.MetadataOther was directly added
  }
protected ThreddsMetadata.MetadataOther readMetadata(Map<String,Object> flds, DatasetBuilder dataset, Element mdataElement) {
    
    Namespace namespace;
    List inlineElements = mdataElement.getChildren();
    if (inlineElements.size() > 0) {
      
      namespace = ((Element) inlineElements.get(0)).getNamespace();
    }
    else {
      namespace = mdataElement.getNamespace(); 
    }

    String mtype = mdataElement.getAttributeValue("metadataType");
    String href = mdataElement.getAttributeValue("href", Catalog.xlinkNS);
    String title = mdataElement.getAttributeValue("title", Catalog.xlinkNS);
    String inheritedS = mdataElement.getAttributeValue("inherited");
    boolean inherited = (inheritedS != null) && inheritedS.equalsIgnoreCase("true");

    boolean isThreddsNamespace = ((mtype == null) || mtype.equalsIgnoreCase("THREDDS")) && namespace.getURI().equals(Catalog.CATALOG_NAMESPACE_10);

    
    if (!isThreddsNamespace) {
      if (inlineElements.size() > 0) {
        
         return new ThreddsMetadata.MetadataOther( mtype, namespace.getURI(), namespace.getPrefix(), inherited, mdataElement);

      }
      else {
        
        return new ThreddsMetadata.MetadataOther(href, title, mtype, namespace.getURI(), namespace.getPrefix(), inherited);
      }
    }

    
    Map<String,Object> useFlds;
    if (inherited) {
      
      ThreddsMetadata tmi = (ThreddsMetadata) dataset.get(Dataset.ThreddsMetadataInheritable);
      if (tmi == null) {
        tmi = new ThreddsMetadata();
        dataset.put(Dataset.ThreddsMetadataInheritable, tmi);
      }
      useFlds = tmi.getFlds();

    }
    else {
      
      useFlds = flds;
    }
    readThreddsMetadataGroup(useFlds, dataset, mdataElement);

    
    
    if (href != null) {
      try {
        URI xlinkUri = Catalog.resolveUri(baseURI, href);
        Element remoteMdata = readMetadataFromUrl(xlinkUri);
        return readMetadata(useFlds, dataset, remoteMdata);
      }
      catch (Exception ioe) {
        errlog.format("Cant read in referenced metadata %s err=%s%n", href, ioe.getMessage());
        logger.debug("Can't read in referenced metadata {} err={}}", href, ioe.getMessage());
      }

    }
    return null;  
  }
protected ThreddsMetadata . MetadataOther readMetadata ( Map < String , Object > flds , DatasetBuilder dataset , Element mdataElement ) { // there are 6 cases to deal with: threddsNamespace vs not & inline vs Xlink & (if thredds) inherited or not Namespace namespace ; List inlineElements = mdataElement . getChildren ( ) ; if ( inlineElements . size ( ) > 0 ) { // look at the namespace of the children, if they exist namespace = ( ( Element ) inlineElements . get ( 0 ) ) . getNamespace ( ) ; } else { namespace = mdataElement . getNamespace ( ) ; // will be thredds } String mtype = mdataElement . getAttributeValue ( "metadataType" ) ; String href = mdataElement . getAttributeValue ( "href" , Catalog . xlinkNS ) ; String title = mdataElement . getAttributeValue ( "title" , Catalog . xlinkNS ) ; String inheritedS = mdataElement . getAttributeValue ( "inherited" ) ; boolean inherited = ( inheritedS != null ) && inheritedS . equalsIgnoreCase ( "true" ) ; boolean isThreddsNamespace = ( ( mtype == null ) || mtype . equalsIgnoreCase ( "THREDDS" ) ) && namespace . getURI ( ) . equals ( Catalog . CATALOG_NAMESPACE_10 ) ; // the case where its not ThreddsMetadata if ( ! isThreddsNamespace ) { if ( inlineElements . size ( ) > 0 ) { // just hold onto the jdom elements as the "content" return new ThreddsMetadata . MetadataOther ( mtype , namespace . getURI ( ) , namespace . getPrefix ( ) , inherited , mdataElement ) ; } else { // otherwise it must be an Xlink return new ThreddsMetadata . MetadataOther ( href , title , mtype , namespace . getURI ( ) , namespace . getPrefix ( ) , inherited ) ; } } // the case where its ThreddsMetadata Map < String , Object > useFlds ; if ( inherited ) { // the case where its inherited ThreddsMetadata: gonna put stuff in the tmi. ThreddsMetadata tmi = ( ThreddsMetadata ) dataset . get ( Dataset . ThreddsMetadataInheritable ) ; if ( tmi == null ) { tmi = new ThreddsMetadata ( ) ; dataset . put ( Dataset . ThreddsMetadataInheritable , tmi ) ; } useFlds = tmi . getFlds ( ) ; } else { // the case where its non-inherited ThreddsMetadata: gonna put stuff directly into the dataset useFlds = flds ; } readThreddsMetadataGroup ( useFlds , dataset , mdataElement ) ; // also need to capture any XLinks. see http://www.unidata.ucar.edu/software/thredds/v4.6/tds/catalog/InvCatalogSpec.html#metadataElement // in this case we just suck it in as if it was inline if ( href != null ) { try { URI xlinkUri = Catalog . resolveUri ( baseURI , href ) ; Element remoteMdata = readMetadataFromUrl ( xlinkUri ) ; return readMetadata ( useFlds , dataset , remoteMdata ) ; } catch ( Exception ioe ) { errlog . format ( "Cant read in referenced metadata %s err=%s%n" , href , ioe . getMessage ( ) ) ; logger . debug ( "Can't read in referenced metadata {} err={}}" , href , ioe . getMessage ( ) ) ; } } return null ; // ThreddsMetadata.MetadataOther was directly added }
/*
<xsd:element name="metadata">
<xsd:complexType>
<xsd:choice>
<xsd:group ref="threddsMetadataGroup" minOccurs="0" maxOccurs="unbounded"/>
<xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:choice>

<xsd:attribute name="inherited" type="xsd:boolean" default="false"/>
<xsd:attribute name="metadataType" type="metadataTypeEnum"/>
<xsd:attributeGroup ref="XLink"/>
</xsd:complexType>
</xsd:element>
/ * <xsd : element name = metadata > <xsd : complexType > <xsd : choice > <xsd : group ref = threddsMetadataGroup minOccurs = 0 maxOccurs = unbounded / > <xsd : any namespace = ##other minOccurs = 0 maxOccurs = unbounded processContents = lax / > < / xsd : choice >