Skip to content

Instantly share code, notes, and snippets.

@thalesvb
Created October 17, 2016 22:19
Show Gist options
  • Save thalesvb/1bf1d4c642d1f35fd86794785dfed7cc to your computer and use it in GitHub Desktop.
Save thalesvb/1bf1d4c642d1f35fd86794785dfed7cc to your computer and use it in GitHub Desktop.
ZZ_UML_CLASS_DIAG_XMI_EXPORT downported to ABAP 7.31
*-------------------------------
* Original Program on https://blogs.sap.com/2015/02/13/uml-class-diagram-export-to-xmi-format-with-abap-standard-classes/
* Downport working on NetWeaver AS 7.31,
*-------------------------------
*"! Adjusted version of SAP standard program UML_CLASS_DIAGRAM.
*"! This version just exports an XMI file which than can be imported into an UML tool.
*"! There is no need to have JNET installed.
report zz_uml_class_diag_xmi_export.
tables tadir.
" ----------------------------------------------------------------------------------------------------------------------------------- *
" selection screen definition
selection-screen: begin of tabbed block mytab for 18 lines,
tab (40) button1 user-command push1 default screen 510,
tab (40) button2 user-command push2 default screen 520,
tab (40) button3 user-command push3 default screen 530,
end of block mytab.
" primary selection criteria
selection-screen begin of screen 510 as subscreen.
selection-screen begin of block s1 with frame title text-sc1.
select-options: so_root for tadir-obj_name, " root objects
so_devc for tadir-devclass. " root objects dev-class
selection-screen end of block s1.
selection-screen end of screen 510.
" UML scanner parameters
selection-screen begin of screen 520 as subscreen.
selection-screen begin of block b0 with frame title text-sc7.
parameters: x_prog type c as checkbox default ' ',
x_fugr type c as checkbox default ' ',
x_struct type c as checkbox default ' '.
selection-screen end of block b0.
selection-screen end of screen 520.
" diagram option parameters
selection-screen begin of screen 530 as subscreen.
selection-screen begin of block b1 with frame title text-sc2.
parameters: x_priv type c as checkbox default 'X',
x_prot type c as checkbox default 'X',
x_packs type c as checkbox default 'X',
x_attr type c as checkbox default 'X',
x_cons type c as checkbox default 'X',
x_meth type c as checkbox default 'X',
x_uses type c as checkbox default ' ',
x_excep type c as checkbox default ' ',
x_asos type c as checkbox default ' ',
x_aggr type c as checkbox default ' '.
selection-screen end of block b1.
selection-screen end of screen 530.
" ----------------------------------------------------------------------------------------------------------------------------------- *
" classes/interfaces
*"! Parameter Interface
interface lif_parameter.
types:
* "! select option line type
begin of mst_so,
sign type char1,
option type char2,
low type text30,
high type text30,
end of mst_so,
* "! select option table type
mtt_so type table of mst_so with default key.
* "! get single parameter
* "! @parameter iv_sel_name | parameter name
* "! @parameter rv_value | value
methods get_parameter
importing iv_parameter_name type selname
returning value(rv_value) type string.
* "! get select option table parameter
* "! @parameter rt_so_value | selection option values
methods get_parameter_so_tab
importing iv_parameter_name type selname
returning value(rt_so_value) type lif_parameter=>mtt_so.
endinterface.
*"! Parameter Class
class lcl_parameter definition.
public section.
interfaces lif_parameter.
* "! constructor
* "! @parameter iv_progname | program name
methods constructor
importing iv_progname type progname.
private section.
* "! program name
data mv_progname type progname.
* "! selection screen parameters
data mt_parameters type sorted table of rsparamsl_255 with non-unique key selname.
* "! fill parameter table
methods fill_parameter_table.
endclass.
class lcl_parameter implementation.
method constructor.
mv_progname = iv_progname.
fill_parameter_table( ).
endmethod.
method fill_parameter_table.
data lt_parameters type table of rsparams ##needed.
data lt_parameters_255 type table of rsparamsl_255.
call function 'RS_REFRESH_FROM_SELECTOPTIONS'
exporting
curr_report = mv_progname
tables
selection_table = lt_parameters
selection_table_255 = lt_parameters_255
exceptions
not_found = 1
no_report = 2
others = 3.
if sy-subrc <> 0.
clear mt_parameters.
else.
insert lines of lt_parameters_255 into table mt_parameters.
endif.
endmethod.
method lif_parameter~get_parameter.
field-symbols:
<param> like line of mt_parameters.
read table mt_parameters assigning <param>
with key selname = iv_parameter_name.
if sy-subrc eq 0.
rv_value = <param>-low.
endif.
endmethod.
method lif_parameter~get_parameter_so_tab.
data:
lt_parameter_flt like mt_parameters.
field-symbols:
<param> like line of lt_parameter_flt,
<so_value> like line of rt_so_value.
loop at mt_parameters assigning <param>
where selname eq iv_parameter_name and
low is not initial or
high is not initial.
* INSERT <param> into table lt_parameter_flt.
append initial line to rt_so_value assigning <so_value>.
move-corresponding <param> to <so_value>.
endloop.
endmethod.
endclass.
*"! exporter interface
interface lif_exporter.
* "! export data
* "! @parameter io_uml_class_scanner | UML class scanner instance
methods export importing io_uml_class_scanner type ref to cl_uml_class_scanner.
endinterface.
*"! XMI exporter class
class lcl_xmi_exporter definition.
public section.
interfaces lif_exporter.
* "! constructor
* "! @parameter io_parameter | parameters
methods constructor importing io_parameter type ref to lif_parameter.
private section.
* "! parameters
data mo_parameter type ref to lif_parameter.
endclass.
class lcl_xmi_exporter implementation.
method constructor.
mo_parameter = io_parameter.
endmethod.
method lif_exporter~export.
data:
lo_xmi type ref to cl_uml_class_decor_xmi,
lr_ref_data type ref to data,
lr_ref_xstr type ref to xstring,
lv_file type string,
lv_fullpath type string,
lv_kind type c,
lv_path type string,
lv_user_action type i.
field-symbols:
<lv_data> type xstring.
create object lo_xmi
exporting
decorator = io_uml_class_scanner.
lo_xmi->set_decorator_configuration( attributes = boolc( mo_parameter->get_parameter( 'X_ATTR') eq abap_true )
methods = boolc( mo_parameter->get_parameter( 'X_METH') eq abap_true )
constants = boolc( mo_parameter->get_parameter( 'X_CONS') eq abap_true )
private_member = boolc( mo_parameter->get_parameter( 'X_PRIV') eq abap_true )
protected_member = boolc( mo_parameter->get_parameter( 'X_PROT') eq abap_true )
packaged_member = boolc( mo_parameter->get_parameter( 'X_PACKS') eq abap_true ) ).
lo_xmi->set_xmi_configuration( aggregations = boolc( mo_parameter->get_parameter( 'X_AGGR') eq abap_true )
associations = boolc( mo_parameter->get_parameter( 'X_ASOS') eq abap_true )
uses = abap_false " Display Dependencies
friends = abap_true " Display Friend Relationship
show_exceptions = boolc( mo_parameter->get_parameter( 'X_EXCEP') eq abap_true ) ).
lo_xmi->get_diagram( importing e_kind = lv_kind changing c_data = lr_ref_data ).
cl_gui_frontend_services=>file_save_dialog(
exporting
default_extension = |XMI|
default_file_name = |export.xmi|
file_filter = |(*.xmi)\|*.xmi|
changing
filename = lv_file
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
exceptions
others = 0 ).
if lv_user_action = cl_gui_frontend_services=>action_cancel.
return.
endif.
lr_ref_xstr ?= lr_ref_data.
assign lr_ref_xstr->* to <lv_data>.
if <lv_data> is assigned.
cl_uml_utilities=>save_xml_local(
exporting
xml = <lv_data>
filename = lv_fullpath ).
endif.
endmethod.
endclass.
*"! export - app
class lcl_app definition.
public section.
class-methods new
returning value(ro_app) type ref to lcl_app.
* "! execute app
* "! @parameter iv_progname | program name
methods execute importing iv_progname type progname.
private section.
* "! program name
data mv_progname type progname.
* "! selection screen parameter
data mo_parameter type ref to lif_parameter.
* "! affected packages
data mt_so_packages type cl_uml_class_scanner=>uml_range_packages.
* "! objects
data mt_so_objects type cl_uml_class_scanner=>uml_range_types.
* "! UML class scanner
data mo_uml_class_scanner type ref to cl_uml_class_scanner.
* "! get selection screen parameter
methods get_selection_screen_parameter.
* "! prepare parameter
methods prepare_parameter.
* "! clear uml cache
methods clear_uml_cache.
* "! prepare UML class canner
methods prepare_uml_class_scanner.
* "! export
methods export.
endclass.
class lcl_app implementation.
method new.
create object ro_app.
endmethod.
method execute.
mv_progname = iv_progname.
get_selection_screen_parameter( ).
prepare_parameter( ).
clear_uml_cache( ).
prepare_uml_class_scanner( ).
export( ).
endmethod.
method get_selection_screen_parameter.
* mo_parameter = NEW lcl_parameter( iv_progname = mv_progname ).
create object mo_parameter
type lcl_parameter
exporting
iv_progname = mv_progname.
endmethod.
method prepare_parameter.
data:
lt_packages type table of devclass,
lt_so_packages type lif_parameter=>mtt_so,
lt_so_objects like lt_so_packages.
field-symbols:
<package> like line of lt_packages,
<so_package> like line of mt_so_packages.
" packages
lt_so_packages = mo_parameter->get_parameter_so_tab( 'SO_DEVC' ).
lt_so_objects = mo_parameter->get_parameter_so_tab( 'SO_ROOT' ).
if lt_so_packages is not initial.
mt_so_packages = lt_so_packages.
elseif lt_so_objects is not initial.
select distinct devclass
from tadir
into table lt_packages
where obj_name in lt_so_objects.
if lt_packages is initial.
return.
endif.
clear mt_so_packages.
loop at lt_packages assigning <package>.
append initial line to mt_so_packages assigning <so_package>.
<so_package>-sign = 'I'.
<so_package>-option = 'EQ'.
<so_package>-low = <package>.
endloop.
endif.
" others
mt_so_objects = mo_parameter->get_parameter_so_tab( 'SO_ROOT' ).
endmethod.
method clear_uml_cache.
cl_uml_cache=>get_singleton( )->clear_type_cache( ).
endmethod.
method prepare_uml_class_scanner.
create object mo_uml_class_scanner.
mo_uml_class_scanner->set_scanner_configuration( scan_local_types = abap_false
scan_programs = boolc( mo_parameter->get_parameter( 'X_PROG' ) eq abap_true )
scan_function_groups = boolc( mo_parameter->get_parameter( 'X_FUGR' ) eq abap_true )
add_structures = boolc( mo_parameter->get_parameter( 'X_STRUCT' ) eq abap_true )
scan_used_types = boolc( mo_parameter->get_parameter( 'X_USES' ) eq abap_true ) ).
if mt_so_packages is initial
and mt_so_objects is initial.
return.
endif.
mo_uml_class_scanner->execute( scan_packages = mt_so_packages
scan_types = mt_so_objects ).
endmethod.
method export.
data:
lo_exporter type ref to lif_exporter.
create object lo_exporter
type lcl_xmi_exporter
exporting
io_parameter = mo_parameter.
lo_exporter->export( io_uml_class_scanner = mo_uml_class_scanner ).
endmethod.
endclass.
" ----------------------------------------------------------------------------------------------------------------------------------- *
" program events
initialization.
button1 = text-007.
button2 = text-008.
button3 = text-009.
start-of-selection.
data:
exception type ref to cx_root.
try.
lcl_app=>new( )->execute( iv_progname = sy-repid ).
catch cx_root into exception.
break-point.
message exception type 'E'.
endtry.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment