use of com.helger.phase4.client.IAS4ClientBuildMessageCallback in project phase4 by phax.
the class MainPhase4PeppolSenderDataport method main.
public static void main(final String[] args) {
WebScopeManager.onGlobalBegin(MockServletContext.create());
// Dump (for debugging purpose only)
AS4DumpManager.setIncomingDumper(new AS4IncomingDumperFileBased());
AS4DumpManager.setOutgoingDumper(new AS4OutgoingDumperFileBased());
try {
final Element aPayloadElement = DOMReader.readXMLDOM(new File("src/test/resources/examples/base-example.xml")).getDocumentElement();
if (aPayloadElement == null)
throw new IllegalStateException("Failed to read XML file to be send");
// Start configuring here
final IParticipantIdentifier aReceiverID = Phase4PeppolSender.IF.createParticipantIdentifierWithDefaultScheme("0204:01-2004-73");
final IAS4ClientBuildMessageCallback aBuildMessageCallback = new IAS4ClientBuildMessageCallback() {
public void onAS4Message(final AbstractAS4Message<?> aMsg) {
final AS4UserMessage aUserMsg = (AS4UserMessage) aMsg;
LOGGER.info("Sending out AS4 message with message ID '" + aUserMsg.getEbms3UserMessage().getMessageInfo().getMessageId() + "'");
LOGGER.info("Sending out AS4 message with conversation ID '" + aUserMsg.getEbms3UserMessage().getCollaborationInfo().getConversationId() + "'");
}
};
final ESimpleUserMessageSendResult eResult = Phase4PeppolSender.builder().documentTypeID(Phase4PeppolSender.IF.createDocumentTypeIdentifierWithDefaultScheme(true ? "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1" : "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.0::2.1")).processID(Phase4PeppolSender.IF.createProcessIdentifierWithDefaultScheme("urn:fdc:peppol.eu:2017:poacc:billing:01:1.0")).senderParticipantID(Phase4PeppolSender.IF.createParticipantIdentifierWithDefaultScheme("9915:phase4-test-sender")).receiverParticipantID(aReceiverID).senderPartyID("POP000306").payload(aPayloadElement).smpClient(new SMPClientReadOnly(Phase4PeppolSender.URL_PROVIDER, aReceiverID, ESML.DIGIT_TEST)).rawResponseConsumer(new AS4RawResponseConsumerWriteToFile()).buildMessageCallback(aBuildMessageCallback).sendMessageAndCheckForReceipt();
LOGGER.info("Peppol send result: " + eResult);
} catch (final Exception ex) {
LOGGER.error("Error sending Peppol message via AS4", ex);
} finally {
WebScopeManager.onGlobalEnd();
}
}
use of com.helger.phase4.client.IAS4ClientBuildMessageCallback in project phase4 by phax.
the class MainPhase4PeppolSenderIBM method main.
public static void main(final String[] args) {
WebScopeManager.onGlobalBegin(MockServletContext.create());
// Dump (for debugging purpose only)
AS4DumpManager.setIncomingDumper(new AS4IncomingDumperFileBased());
AS4DumpManager.setOutgoingDumper(new AS4OutgoingDumperFileBased());
try {
final Element aPayloadElement = DOMReader.readXMLDOM(new File("src/test/resources/examples/base-example.xml")).getDocumentElement();
if (aPayloadElement == null)
throw new IllegalStateException("Failed to read XML file to be send");
// Start configuring here
final IParticipantIdentifier aReceiverID = Phase4PeppolSender.IF.createParticipantIdentifierWithDefaultScheme("0088:5050689000018");
final IAS4ClientBuildMessageCallback aBuildMessageCallback = new IAS4ClientBuildMessageCallback() {
public void onAS4Message(final AbstractAS4Message<?> aMsg) {
final AS4UserMessage aUserMsg = (AS4UserMessage) aMsg;
LOGGER.info("Sending out AS4 message with message ID '" + aUserMsg.getEbms3UserMessage().getMessageInfo().getMessageId() + "'");
LOGGER.info("Sending out AS4 message with conversation ID '" + aUserMsg.getEbms3UserMessage().getCollaborationInfo().getConversationId() + "'");
}
};
final ESimpleUserMessageSendResult eResult;
eResult = Phase4PeppolSender.builder().documentTypeID(Phase4PeppolSender.IF.createDocumentTypeIdentifierWithDefaultScheme("urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1")).processID(Phase4PeppolSender.IF.createProcessIdentifierWithDefaultScheme("urn:fdc:peppol.eu:2017:poacc:billing:01:1.0")).senderParticipantID(Phase4PeppolSender.IF.createParticipantIdentifierWithDefaultScheme("9915:phase4-test-sender")).receiverParticipantID(aReceiverID).senderPartyID("POP000306").payload(aPayloadElement).smpClient(new SMPClientReadOnly(Phase4PeppolSender.URL_PROVIDER, aReceiverID, ESML.DIGIT_TEST)).rawResponseConsumer(new AS4RawResponseConsumerWriteToFile()).validationConfiguration(PeppolValidation3_13_0.VID_OPENPEPPOL_INVOICE_V3, new Phase4PeppolValidatonResultHandler()).buildMessageCallback(aBuildMessageCallback).sendMessageAndCheckForReceipt();
LOGGER.info("Peppol send result: " + eResult);
} catch (final Exception ex) {
LOGGER.error("Error sending Peppol message via AS4", ex);
} finally {
WebScopeManager.onGlobalEnd();
}
}
use of com.helger.phase4.client.IAS4ClientBuildMessageCallback in project phase4 by phax.
the class AS4ClientUserMessage method buildMessage.
@Override
@Nonnull
public AS4ClientBuiltMessage buildMessage(@Nonnull @Nonempty final String sMessageID, @Nullable final IAS4ClientBuildMessageCallback aCallback) throws WSSecurityException, MessagingException {
final String sAgreementRefPMode = m_aPModeIDFactory.apply(this);
// check mandatory attributes
_checkMandatoryAttributes();
final boolean bSign = signingParams().isSigningEnabled();
final boolean bEncrypt = cryptParams().isCryptEnabled(LOGGER::warn);
final boolean bAttachmentsPresent = m_aAttachments.isNotEmpty();
final Ebms3MessageInfo aEbms3MessageInfo = MessageHelperMethods.createEbms3MessageInfo(sMessageID, getRefToMessageID(), getSendingDateTimeOrNow());
final Ebms3PayloadInfo aEbms3PayloadInfo = MessageHelperMethods.createEbms3PayloadInfo(m_aPayload != null, m_aAttachments);
final Ebms3CollaborationInfo aEbms3CollaborationInfo = MessageHelperMethods.createEbms3CollaborationInfo(sAgreementRefPMode, m_sAgreementRefValue, m_sServiceType, m_sServiceValue, m_sAction, m_sConversationID);
final Ebms3PartyInfo aEbms3PartyInfo = MessageHelperMethods.createEbms3PartyInfo(m_sFromRole, m_sFromPartyIDType, m_sFromPartyIDValue, m_sToRole, m_sToPartyIDType, m_sToPartyIDValue);
final Ebms3MessageProperties aEbms3MessageProperties = MessageHelperMethods.createEbms3MessageProperties(m_aEbms3Properties);
final AS4UserMessage aUserMsg = AS4UserMessage.create(aEbms3MessageInfo, aEbms3PayloadInfo, aEbms3CollaborationInfo, aEbms3PartyInfo, aEbms3MessageProperties, getSoapVersion()).setMustUnderstand(true);
if (aCallback != null)
aCallback.onAS4Message(aUserMsg);
final Document aPureDoc = aUserMsg.getAsSoapDocument(m_aPayload);
if (aCallback != null)
aCallback.onSoapDocument(aPureDoc);
// 1. compress
// Is done when the attachments are added
// 2. sign and/or encrpyt
Document aDoc = aPureDoc;
AS4MimeMessage aMimeMsg = null;
if (bSign || bEncrypt) {
AS4HttpDebug.debug(() -> "Unsigned/unencrypted UserMessage:\n" + XMLWriter.getNodeAsString(aPureDoc, AS4HttpDebug.getDebugXMLWriterSettings()));
final IAS4CryptoFactory aCryptoFactory = internalCreateCryptoFactory();
// 2a. sign
if (bSign) {
final boolean bMustUnderstand = true;
final Document aSignedDoc = AS4Signer.createSignedMessage(aCryptoFactory, aDoc, getSoapVersion(), aUserMsg.getMessagingID(), m_aAttachments, getAS4ResourceHelper(), bMustUnderstand, signingParams().getClone());
aDoc = aSignedDoc;
if (aCallback != null)
aCallback.onSignedSoapDocument(aSignedDoc);
AS4HttpDebug.debug(() -> "Signed UserMessage:\n" + XMLWriter.getNodeAsString(aSignedDoc, AS4HttpDebug.getDebugXMLWriterSettings()));
}
// 2b. encrypt
if (bEncrypt) {
// MustUnderstand always set to true
final boolean bMustUnderstand = true;
if (bAttachmentsPresent) {
aMimeMsg = AS4Encryptor.encryptMimeMessage(getSoapVersion(), aDoc, m_aAttachments, aCryptoFactory, bMustUnderstand, getAS4ResourceHelper(), cryptParams().getClone());
if (aCallback != null)
aCallback.onEncryptedMimeMessage(aMimeMsg);
} else {
final Document aEncryptedDoc = AS4Encryptor.encryptSoapBodyPayload(aCryptoFactory, getSoapVersion(), aDoc, bMustUnderstand, cryptParams().getClone());
if (aCallback != null)
aCallback.onEncryptedSoapDocument(aDoc);
aDoc = aEncryptedDoc;
}
}
}
if (bAttachmentsPresent && aMimeMsg == null) {
// * not encrypted, not signed
// * not encrypted, signed
aMimeMsg = MimeMessageCreator.generateMimeMessage(getSoapVersion(), aDoc, m_aAttachments);
}
if (aMimeMsg != null) {
// Wrap MIME message
return new AS4ClientBuiltMessage(sMessageID, new HttpMimeMessageEntity(aMimeMsg));
}
// Wrap SOAP XML
return new AS4ClientBuiltMessage(sMessageID, new HttpXMLEntity(aDoc, getSoapVersion().getMimeType()));
}
use of com.helger.phase4.client.IAS4ClientBuildMessageCallback in project phase4 by phax.
the class AbstractAS4Client method sendMessageWithRetries.
/**
* Send the AS4 client message created by
* {@link #buildMessage(String, IAS4ClientBuildMessageCallback)} to the
* provided URL. This methods does take retries into account. It synchronously
* handles the retries and only returns after the last retry.
*
* @param <T>
* The response data type
* @param sURL
* The URL to send the HTTP POST to
* @param aResponseHandler
* The response handler that converts the HTTP response to a domain
* object. May not be <code>null</code>.
* @param aCallback
* An optional callback for the different stages of building the
* document. May be <code>null</code>.
* @param aOutgoingDumper
* An outgoing dumper to be used. Maybe <code>null</code>. If
* <code>null</code> the global outgoing dumper from
* {@link AS4DumpManager} is used.
* @param aRetryCallback
* An optional callback to be invoked if a retry happens on HTTP level.
* May be <code>null</code>.
* @return The sent message that contains
* @throws IOException
* in case of error when building or sending the message
* @throws WSSecurityException
* In case there is an issue with signing/encryption
* @throws MessagingException
* in case something happens in MIME wrapping
* @since 0.9.14
*/
@Nonnull
public final <T> AS4ClientSentMessage<T> sendMessageWithRetries(@Nonnull final String sURL, @Nonnull final ResponseHandler<? extends T> aResponseHandler, @Nullable final IAS4ClientBuildMessageCallback aCallback, @Nullable final IAS4OutgoingDumper aOutgoingDumper, @Nullable final IAS4RetryCallback aRetryCallback) throws IOException, WSSecurityException, MessagingException {
// Create a new message ID for each build!
final String sMessageID = createMessageID();
final AS4ClientBuiltMessage aBuiltMsg = buildMessage(sMessageID, aCallback);
HttpEntity aBuiltEntity = aBuiltMsg.getHttpEntity();
final HttpHeaderMap aBuiltHttpHeaders = aBuiltMsg.getCustomHeaders();
if (m_aHttpRetrySettings.isRetryEnabled() || aOutgoingDumper != null || AS4DumpManager.getOutgoingDumper() != null) {
// Ensure a repeatable entity is provided
aBuiltEntity = m_aResHelper.createRepeatableHttpEntity(aBuiltEntity);
}
// Keep the HTTP response status line for external evaluation
final Wrapper<StatusLine> aStatusLineKeeper = new Wrapper<>();
// Keep the HTTP response headers for external evaluation
final HttpHeaderMap aResponseHeaders = new HttpHeaderMap();
final ResponseHandler<T> aRealResponseHandler = x -> {
// Remember the HTTP response data
aStatusLineKeeper.set(x.getStatusLine());
final Header[] aHeaders = x.getAllHeaders();
if (aHeaders != null)
for (final Header aHeader : aHeaders) aResponseHeaders.addHeader(aHeader.getName(), aHeader.getValue());
// Call the original handler
return aResponseHandler.handleResponse(x);
};
final T aResponseContent = m_aHttpPoster.sendGenericMessageWithRetries(sURL, aBuiltHttpHeaders, aBuiltEntity, sMessageID, m_aHttpRetrySettings, aRealResponseHandler, aOutgoingDumper, aRetryCallback);
return new AS4ClientSentMessage<>(aBuiltMsg, aStatusLineKeeper.get(), aResponseHeaders, aResponseContent);
}
use of com.helger.phase4.client.IAS4ClientBuildMessageCallback in project phase4 by phax.
the class AbstractAS4Client method sendMessageAndGetMicroDocument.
@Nullable
public IMicroDocument sendMessageAndGetMicroDocument(@Nonnull final String sURL) throws WSSecurityException, IOException, MessagingException {
final IAS4ClientBuildMessageCallback aCallback = null;
final IAS4OutgoingDumper aOutgoingDumper = null;
final IAS4RetryCallback aRetryCallback = null;
final IMicroDocument ret = sendMessageWithRetries(sURL, new ResponseHandlerMicroDom(), aCallback, aOutgoingDumper, aRetryCallback).getResponse();
AS4HttpDebug.debug(() -> "SEND-RESPONSE received: " + MicroWriter.getNodeAsString(ret, AS4HttpDebug.getDebugXMLWriterSettings()));
return ret;
}
Aggregations