;+
; ap_getdataset 
; returns a structure qdataset.  The goal of this is to return an IDL structure
; that is as much like a QDataSet as possible.
; created on __DATE__
;-

;+
; returns an IDL structure of a Java Map, or 0.
; keycount is the number of keys in the map. 
;-
function ap_mapToStruct, map, qds, keycount=keycount
   it= (map->keySet())->iterator()
   util= OBJ_NEW( 'IDLjavaObject$Static$org_virbo_ittsupport_idlsupport', 'org.virbo.idlsupport.Util' )
   keycount=0
   if ( it->hasNext() ) then begin
      key= it->next()
      val= map->get(key)
      key= key->toString()
      if ( obj_class( val ) eq 'IDLJAVAOBJECT$JAVA_LANG_STRING' ) then begin
         val= val->toString()
      endif else if ( obj_class( val ) eq 'IDLJAVAOBJECT$JAVA_LANG_DOUBLE' ) then begin
         val= val->doubleValue()
      endif else if ( util->isQDataSet( val ) ) then begin
         val= qds->nameFor( val )
      endif else if ( util->isMap( val ) ) then begin
         val= ap_mapToStruct( val, qds )
      endif
      if ( size( val, /type ) ne 11 ) then begin
        keycount= keycount+1
        result1= create_struct( key, val )
        if ( n_elements( result ) eq 0 ) then result= result1 else result= create_struct( result, result1 )
      endif
   endif
   if ( keycount gt 0 ) then begin
      return, result
   endif else begin
      return, 0
   endelse
end

function ap_getdataset_getProps, qds, n, keycount=keycount
    map= qds->properties(n)
    return, ap_mapToStruct( map, qds, keycount=keycount )
;    for i=0, qds->rank(n)-1 do begin
;       propname= 'DEPEND_'+strtrim(i,2)
;       if ( qds->hasProperty( n, propname ) ) then begin 
;          val= qds->property( n, propname )
;          if ( obj_class( val ) eq 'IDLJAVAOBJECT$JAVA_LANG_STRING' ) then begin
;             val= val->toString()
;          endif else if ( obj_class( val ) eq 'IDLJAVAOBJECT$JAVA_LANG_DOUBLE' ) then begin
;             val= val->doubleValue()
;          endif else if ( qds->isMap( val ) ) then begin
;             val= mapToStruct( val )
;          endif
;          if ( n_elements( result ) eq 0 ) then begin
;             result= create_struct( propname, val )
;          endif else begin
;             result= create_struct( result, create_struct( propname, val ) )  
;          endelse
;       endif
;    endfor
;    moreprops= [ 'UNITS', 'TITLE' 
;    return, result
end


function ap_getdataset, url

    if ( n_elements( url ) eq 0 ) then url= 'file:///media/mini/data.backup/examples/dat/asciiTab2.dat'

    catch, err

    if ( err eq 0 ) then begin

        util= OBJ_NEW( 'IDLjavaObject$Static$org_virbo_ittsupport_idlsupport', 'org.virbo.idlsupport.Util' )

        qds= OBJ_NEW('IDLjavaObject$GetDataSet', 'org.virbo.idlsupport.APDataSet')  

        qds->setDataSetUrl, url 
        qds->doGetDataSet

        n= qds->name()

        nele= long(product( qds->lengths(n) ))
        if ( nele eq 0 ) then begin ; qdatasets can be zero length.  This is a problem for IDL.
            sizes= [ n_elements( qds->lengths(n) ), qds->lengths(n), 4, nele ]
            result= { sizes:sizes }
        endif else begin
            data= make_array( /double, nele )
            qds->valuesAlias, n, data
            data= reform( data, qds->lengths(n) )

            result= { data:data }
        endelse
        props= ap_getdataset_getProps( qds, n, keycount=keycount )
        if ( keycount gt 0 ) then result= create_struct( result, props )

        theresult= create_struct( n, result )

        names= qds->names()

        for i=0,n_elements(names)-1 do begin
           n= names[i]
           if ( n ne qds->name() ) then begin
               props= ap_getdataset_getProps( qds, n, keycount=keycount )
               doLabels= 0
               if ( qds->hasProperty( n, 'UNITS' ) ) then begin
                  units= qds->property( n, 'UNITS' )
                  units= units->toString()
                  if ( strpos( units, 'ordinal' )ne -1 ) then doLabels=1
               endif
               if ( doLabels ) then begin
                   data= make_array( /string, product( qds->lengths( n ) ) )    
                   qds->labelsAlias, n, data 
                   data= reform( data, qds->lengths(n) )
                   result= { data:data }
               endif else begin
                   data= make_array( /double, product( qds->lengths( n ) ) )    
                   qds->valuesAlias, n, data 
                   data= reform( data, qds->lengths(n) )
                   result= { data:data }
               endelse
               if ( keycount gt 0 ) then result= create_struct( result, props )
               theresult= create_struct( theresult, create_struct( n, result ) )
           endif
        endfor
        return, theresult

    endif else begin
       catch, /cancel
       oJSession = OBJ_NEW('IDLJavaObject$IDLJAVABRIDGESESSION')  
       oJExc= oJSession->GetException()  
       if ( obj_valid(oJExc) ) then oJExc->PrintStackTrace  
       message, !error_state.msg

    endelse

    
end