Para lograrar una configuración correcta para la publicación de estos Web Services de intercambio hay que definir un par de archivos a nivel de la webapp:
WEB-INF\sun-jaxws.xml: En este archivo hay que agregar la siguiente línea:
<endpoint name="WSIntercambio V1" implementation="com.efactura.intercambioemisores.awsintercambiov1_services" url-pattern="/ws_efactura_intercambio"/>
Esta línea lo que hace es lograr mantener el estándar declarado por DGI relativo al nombre del web service.
Si el archivo no está definido, se incluye junto al XPZ del módulo, un archivo correspondiente.
Hay que tomar en cuenta que este archivo GeneXus constantemente lo sobreescribe por lo que habría que dejarlo definido ReadOnly para que no lo sobreescriba luego de un Build All.
Si la webapp está ligada al generador de GeneXus, este sobreescribirá el archivo en cada Build, por lo que se recomienda dejar el archivo de la webapp en ReadOnly. GeneXus, en este caso no generará ningún mensaje de error al no poder copiarlo en tiempo de Compilación.
NOTA Importante
La propiedad "implementation" del nodo "endpoint" debe hacer una referencia absoluta a la clase por lo que deberá modificarse para identificar correctamente ej Java Package Name que estén utilizando.
WEB-INF\classes\gx_handler_chain.xml: Define la clase handler, que va ser utilizada para firmar la respuesta del SOAP.
Dentro del nodo <handler-chain> hay que definir el siguiente handler adicional:
<handler>
<handler-class>uy.com.puntoexe.wssecsoaphandler.WSSecSOAPHandler</handler-class>
</handler>
Esta referencia al handler será atendida por la librería PuntoExeSOAPWSSecHandler.jar
Si el archivo no está definido, se incluye junto al XPZ del módulo, un archivo correspondiente al gx_handler_chain.xml y la librería PuntoExeSOAPWSSecHandler.jar
Si la webapp está ligada al generador de GeneXus, este sobreescribirá el archivo en cada Build, por lo que se recomienda dejar el archivo de la webapp en ReadOnly. GeneXus generará un mensaje de error en el Output en tiempo de compilación similar a este: "Access to the path 'XXX\WEB-INF\classes\gx_handler_chain.xml' is denied."
Para generar el WSDL correctamente hay dos opciones disponibles:
En este caso se podrá configurar el WSDL para compatibilidad de WS-Security con la única salvedad que el Address Location se calcula en forma automática.
Para configurarlo de este modo deberán estar los siguientes archivos:
Archivo WSDL en directorio WEB-INF\wsdl\ws_efactura_intercambio.wsdl
Archivo XSD en el directorio static\wsdl\ws_efactura_intercambio.xsd
Referencia al archivo a nivel del WEB-INF\sun-jaxws.xml:
<endpoint name="WSIntercambio V1" implementation="com.efactura.intercambioemisores.awsintercambiov1_services" wsdl="WEB-INF/wsdl/ws_efactura_intercambio.wsdl" url-pattern="/ws_efactura_intercambio"/>
NOTA Importante
La propiedad "implementation" del nodo "endpoint" debe hacer una referencia absoluta a la clase por lo que deberá modificarse para identificar correctamente ej Java Package Name que estén utilizando.
Esta línea lo que hace es declarar el formato base por el cual GeneXus debe considerar como definición básica.
En este caso se podrá configurar el WSDL para compatibilidad de WS-Security pero adicionalmente se define el Address Location con la URL que se quiera utilizar.
Particularmente en este caso no se toma como una referencia base sino que es directamente el resultado del consumo del la URL?wsdl
Para configurarlo de este modo deberán estar los siguientes archivos:
Archivo WSDL en directorio static\wsdl\ws_efactura_intercambio.wsdl
NOTA Importante
Este archivo debe ser modificado en el tag address para poner la URL deseada:
<soap:address location="https://dev.puntoexe.com.uy/eFacturaTesting/ws_efactura_intercambio"/>
Archivo XSD en el directorio static\wsdl\ws_efactura_intercambio.xsd
Archivo jar en la el directorio lib: PuntoExeSOAPWSDLStaticContent.jar
Referencia al archivo a nivel del WEB-INF\web.xml:
<filter>
<filter-name>WSDLRequestFilter</filter-name>
<filter-class>uy.com.puntoexe.wsdlstaticcontent.EfacturaIntercambioWSDLRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>WSDLRequestFilter</filter-name>
<url-pattern>/ws_efactura_intercambio/*</url-pattern>
</filter-mapping>
Estas líneas lo que hacen es definir una clase para interceptar la invocación de la URL de intercambio para permitir reemplazar el contenido del WSDL al del archivo static\wsdl\ws_efactura_intercambio.xml
A nivel del environment es necesario:
Copiar los siguientes archivos a la carpeta Web del Environment:
PuntoExe.Patterns.PXTools.dll
PXFilesActions.exe
PXFilesActionsWSNativeSOAPActions.bat
PXFilesActionsWSNativeSOAPActions.xml
Esta carpeta es la que se accede a través del menú: Tools -> Explore Target Environment Directory.
En ese mismo directorio modificar el archivo CALLMAKE.BAT.
En la línea 2 de ese archivo agregar el siguiente comando:
Call PXFilesActionsWSNativeSOAPActions.bat
Deberá quedar de la siguiente forma:
Este bat, ejecutable, xml y dll se encargan de modificar el archivo generado asociado al procedimiento WSIntercambioV1.
El objetivo es modificar la forma de declarar el método cuando se usa la propiedad "Use Narive SOAP" por el cual GeneXus cambia la forma de generar el método simplemente identificando de idéntica forma como está declarado en el Stub. Cuando no se tiene la propiedad "Use Native SOAP" habilitado GeneXus identifica al método en mayúscula y con un prefijo con el nombre del procedimiento.
En este caso la DGI requiere que el método tenga la siguiente notación: WS_eFactura_Intercambio.SOBRE
Lo que hace este ejecutable es remplazar la forma de declarar un método y cambiarlo por el estándar declarado por DGI.
Es por esto que en el archivo PXFilesActionsWSNativeSOAPActions.xml se definen los siguientes cambios:
Ajusta en el nombre del webservice para que el nombre del objeto en Genexus ("awsintercambiov1") sea reemplazado por el nombre "WS_eFactura_Intercambio".
Ajusta en la declaración de los nombres de cada uno de los cuatro métodos y operaciones para estar de acuerdo con el patrón definido en el WSDL de DGI.