Meine Intension dahinter war einfach die Tatsache, daß ich es Leid war bei der Implementierung eines Inboundproxys immer die gleichen Angaben in der SPRX_TEST_INBOUND machen zu müssen (auch eine Variante anzulegen war mir zu - naja). Zudem mußte ich damals andauernd in den Debugger springen und das Sendende System setzten (diese Funktion wird von dem Standardtestreport nicht unterstützt) Und wie es sich für einen Programmierer gehört ist dann folgender Report dabei herausgekommen.
Der Report gliedert sich im Grunde in vier Teile.
1. XML-String erstellen
Per concatenate wird hier das XML zusammengebastelt. Als Vorlage diente mir ein Original aus der SXMB_MONI. Gewisse Platzhalter lassen auch eine Generik zu. z.B. wie folgt:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- GeSHi ©
Der konkatinierte String muß nun in einen RAW string umgewandelt werden. Am einfachsten geht das mittels folgender Klasse CL_ABAP_CONV_OUT_CE.
2. XML 2 ABAP Mapper
Im zweiten Schritt kommt der XML 2 ABAP mapper. Die Daten liegen derzeit ja im XML-Format vor. Innerhalb eines Proxies sind diese jedoch in einer generierten komplexen Struktur. Gemapped wird das ganze durch generiertes XSLT Mapping. Wie das Mapping aussehen soll zieht wird über das IFR ermittelt. Dazu ist es notwendig Namespace und Interface das aufgerufen werden soll zu nennen:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- * Namespace des empfangenden Interfaces
- lv_receiver-interface-namespace = 'XYZ_interface_namespace'.
- * Empfangendes interface
- lv_receiver-interface-name = 'XYZ_interface_name'.
- GeSHi ©
Entegen der sonst allgemeingltigen ABAP Zeichenkettenpolitik muß man hier die kompletten Namen nicht in Großbuchstaben schreiben, da diese Informationen vom IFR kommen und da dies Java ist wird nicht so auf Groß/Kleinschreibung geachtet.
Mit folgender Zeile werden die informationen über den Proxy gezogen:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- lo_registry = cl_proxy_inbound_registry=>create_from_ifr_name( p_interface = lv_receiver-interface ).
- GeSHi ©
Danach wird das passende XSLT gesucht:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- lo_xslt = cl_proxy_stylesheet_runtime=>create_from_method
- GeSHi ©
Existiert kein Mapping (z.B. beim Erstaufruf), dann wird schnell eins generiert:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- lo_xslt->generate( ).
- GeSHi ©
Nicht wundern, wenn das Mapping in der SE80 bei euren lokalen Objekten auftaucht - Das XSLT scheint immer bei dem User zu liegen der als erster die Codingzeilen durchläuft.
Danach wird aus den Interfacedaten noch die ABAPStruktur initialisiert. Und letztendlich wird Mapping mittels CALL TRANSFORMATION durchgeführt.
3. Senderparty festlegen
Das ist der Punkt, an dem SPRX_TEST_INBOUND nicht mithalten kann *g* Im Grunde werden hier die Daten für den Proxy vorbereitet. Das Object lo_controller bekommt die XML Nachricht und das Business System zugeschoben (hier wird der SLD name des Businessystems verwendet). Die Tabelle lt_parameters enthält dann die Parameter für den Proxy selbst.
4. Proxy aufrufen
Im letzten Schritt wird dann der Proxy gerufen. Proxytypisch komplett dynamisch :
Zuerst den methoden namen zusammenbasteln:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- GeSHi ©
und dann den dynamischen call mit unserer parametertabelle:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- CALL METHOD (lo_registry->implementing_class)=>(l_method)
- PARAMETER-TABLE
- lt_parameters.
- GeSHi ©
Der Rest ist Errorhandling. Um so allgmein wie möglich zu bleiben fange ich hier alle Fehler zu zur cx_root Fehlerklasse ab.
Eine Letzte Anmerkung habe ich noch: Ihr solltet euch nicht wundern, wenn dieser Report keine Eintrag in der SXMB_MONI hinterlässt. Ich hab mich hier nur auf das wesentliche beschränkt
Viel Spaß noch!
Gruß Azreal
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- l_xml_string TYPE string,
- l_xml_xstring TYPE xstring.
- ***************** 1. * XML-String erstellen **************
- CONCATENATE l_xml_string '<ns1:XYZ xmlns:ns1="http://..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' INTO l_xml_string.
- * XML-String in raw mappen
- l_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
- l_xml_xstring = l_conv->get_buffer( ).
- ***************** 2. * XML 2 ABAP Mapper **************
- ls_binding TYPE abap_trans_resbind,
- ls_parameter TYPE abap_parmbind,
- lt_parameters TYPE abap_parmbind_tab.
- bindings TYPE abap_trans_resbind_tab,
- stylesheet TYPE cxsltdesc,
- END OF rmdata.
- lt_signature TYPE sproxsigtt,
- lo_xslt TYPE REF TO cl_proxy_stylesheet_runtime,
- lo_registry TYPE REF TO cl_proxy_inbound_registry,
- lv_receiver TYPE prx_srvc.
- * Namespace des empfangenden Interfaces
- lv_receiver-interface-namespace = 'XYZ_interface_namespace'.
- * Empfangendes interface
- lv_receiver-interface-name = 'XYZ_interface_name'.
- TRY.
- TRY.
- * Registry object interface aus repository ziehen.
- lo_registry = cl_proxy_inbound_registry=>create_from_ifr_name( p_interface = lv_receiver-interface ).
- * Stylesheet vom Proxy ziehen.
- lo_xslt = cl_proxy_stylesheet_runtime=>create_from_method(
- p_object = lo_registry->object
- p_obj_name = lo_registry->object_name
- p_method = lo_registry->object_name1
- p_extended_xml_handling = '').
- * ABAP 2 XML mapping generieren
- lo_xslt->generate( ).
- ls_rmdata-stylesheet = lo_xslt->abap2xml_name.
- * initialisieren der ABAP Struktur
- lt_signature = lo_xslt->get_signature( ).
- ls_binding-name = <sig>-param.
- CREATE DATA ls_binding-value TYPE (<sig>-typename).
- ls_parameter-name = <sig>-param.
- ls_parameter-value = ls_binding-value.
- * XML auf ABAP mappen
- CALL TRANSFORMATION (lo_xslt->xml2abap_name)
- SOURCE XML l_xml_xstring
- RESULT (lt_send_bindings).
- lv_error = 'Unable to transform XML'.
- ***************** 3. * Senderparty festlegen **************
- TRY.
- lo_controller = cl_ai_posting_controller=>create_controller( ).
- * XML anh㭧en
- lo_controller->set_input_payload( l_xml_xstring ).
- * Name des empfangenden Systems setzten
- * Empf㭧ersystem festlegen (SLD_NAME)
- lv_receiver-bsn_system = 'SLD_NAME'.
- lo_controller->set_sender_service( lv_receiver ).
- * Controller in parameterliste hinzufügen
- ls_parameter-name = 'CONTROLLER'.
- lo_appl_controller ?= lo_controller.
- lv_error = 'Unable to fill controller'.
- ***************** 4. * Proxy aufrufen **************
- TRY.
- * Proxy aufrufen
- CALL METHOD (lo_registry->implementing_class)=>(l_method)
- PARAMETER-TABLE
- lt_parameters.
- * Problem bei der Verarbeitung:...
- lv_order_fault ?= <lv_test>.
- lv_error = lv_order_fault->standard-fault_text.
- GeSHi ©