All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.toop.connector.app.incoming.MPTrigger Maven / Gradle / Ivy

/**
 * Copyright (C) 2018-2020 toop.eu
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package eu.toop.connector.app.incoming;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;

import com.helger.commons.ValueEnforcer;
import com.helger.commons.annotation.Nonempty;
import com.helger.commons.collection.ArrayHelper;
import com.helger.commons.error.level.EErrorLevel;
import com.helger.commons.mime.IMimeType;
import com.helger.commons.state.ESuccess;
import com.helger.commons.string.StringHelper;
import com.helger.commons.url.IURLProtocol;
import com.helger.commons.url.URLProtocolRegistry;
import com.helger.httpclient.HttpClientManager;
import com.helger.httpclient.response.ResponseHandlerByteArray;

import eu.toop.connector.api.TCConfig;
import eu.toop.connector.api.http.TCHttpClientSettings;
import eu.toop.connector.api.me.incoming.IMEIncomingTransportMetadata;
import eu.toop.connector.api.me.incoming.IncomingEDMErrorResponse;
import eu.toop.connector.api.me.incoming.IncomingEDMRequest;
import eu.toop.connector.api.me.incoming.IncomingEDMResponse;
import eu.toop.connector.api.me.model.MEPayload;
import eu.toop.connector.api.rest.TCIncomingMessage;
import eu.toop.connector.api.rest.TCIncomingMetadata;
import eu.toop.connector.api.rest.TCPayload;
import eu.toop.connector.api.rest.TCPayloadType;
import eu.toop.connector.api.rest.TCRestJAXB;
import eu.toop.kafkaclient.ToopKafkaClient;
import eu.toop.regrep.CRegRep4;

/**
 * Push incoming messages to DC/DP
 *
 * @author Philip Helger
 */
@Immutable
public final class MPTrigger
{
  private MPTrigger ()
  {}

  @Nonnull
  private static ESuccess _forwardMessage (@Nonnull final TCIncomingMessage aMsg, @Nonnull @Nonempty final String sDestURL)
  {
    ValueEnforcer.notNull (aMsg, "Msg");
    ValueEnforcer.notEmpty (sDestURL, "Destination URL");

    if (StringHelper.hasNoText (sDestURL))
      throw new IllegalStateException ("No URL for handling inbound messages is defined.");
    final IURLProtocol aProtocol = URLProtocolRegistry.getInstance ().getProtocol (sDestURL);
    if (aProtocol == null)
      throw new IllegalStateException ("The URL for handling inbound messages is invalid.");

    // Convert XML to bytes
    final byte [] aPayload = TCRestJAXB.incomingMessage ().getAsBytes (aMsg);
    if (aPayload == null)
      throw new IllegalStateException ();

    ToopKafkaClient.send (EErrorLevel.INFO, () -> "Sending inbound message to '" + sDestURL + "' with " + aPayload.length + " bytes");

    // Main sending
    try (final HttpClientManager aHCM = HttpClientManager.create (new TCHttpClientSettings ()))
    {
      final HttpPost aPost = new HttpPost (sDestURL);
      aPost.setEntity (new ByteArrayEntity (aPayload));
      final byte [] aResult = aHCM.execute (aPost, new ResponseHandlerByteArray ());

      ToopKafkaClient.send (EErrorLevel.INFO,
                            () -> "Sending inbound message was successful. Got " + ArrayHelper.getSize (aResult) + " bytes back");
      return ESuccess.SUCCESS;
    }
    catch (final Exception ex)
    {
      ToopKafkaClient.send (EErrorLevel.ERROR, () -> "Sending inbound message to '" + sDestURL + "' failed", ex);
      return ESuccess.FAILURE;
    }
  }

  @Nonnull
  private static TCIncomingMetadata _createMetadata (@Nonnull final IMEIncomingTransportMetadata aMD,
                                                     @Nonnull final TCPayloadType ePayloadType)
  {
    final TCIncomingMetadata ret = new TCIncomingMetadata ();
    ret.setSenderID (TCRestJAXB.createTCID (aMD.getSenderID ()));
    ret.setReceiverID (TCRestJAXB.createTCID (aMD.getReceiverID ()));
    ret.setDocTypeID (TCRestJAXB.createTCID (aMD.getDocumentTypeID ()));
    ret.setProcessID (TCRestJAXB.createTCID (aMD.getProcessID ()));
    ret.setPayloadType (ePayloadType);
    return ret;
  }

  @Nonnull
  private static TCPayload _createPayload (@Nonnull final byte [] aValue,
                                           @Nullable final String sContentID,
                                           @Nonnull final IMimeType aMimeType)
  {
    final TCPayload ret = new TCPayload ();
    ret.setValue (aValue);
    ret.setContentID (sContentID);
    ret.setMimeType (aMimeType.getAsString ());
    return ret;
  }

  @Nonnull
  public static ESuccess forwardMessage (@Nonnull final IncomingEDMRequest aRequest)
  {
    return forwardMessage (aRequest, TCConfig.MEM.getMEMIncomingURL ());
  }

  @Nonnull
  public static ESuccess forwardMessage (@Nonnull final IncomingEDMRequest aRequest, @Nonnull @Nonempty final String sDestUrl)
  {
    final TCIncomingMessage aMsg = new TCIncomingMessage ();
    aMsg.setMetadata (_createMetadata (aRequest.getMetadata (), TCPayloadType.REQUEST));
    aMsg.addPayload (_createPayload (aRequest.getRequest ().getWriter ().getAsBytes (), null, CRegRep4.MIME_TYPE_EBRS_XML));
    return _forwardMessage (aMsg, sDestUrl);
  }

  @Nonnull
  public static ESuccess forwardMessage (@Nonnull final IncomingEDMResponse aResponse)
  {
    return forwardMessage (aResponse, TCConfig.MEM.getMEMIncomingURL ());
  }

  @Nonnull
  public static ESuccess forwardMessage (@Nonnull final IncomingEDMResponse aResponse, @Nonnull @Nonempty final String sDestURL)
  {
    final TCIncomingMessage aMsg = new TCIncomingMessage ();
    aMsg.setMetadata (_createMetadata (aResponse.getMetadata (), TCPayloadType.RESPONSE));
    aMsg.addPayload (_createPayload (aResponse.getResponse ().getWriter ().getAsBytes (), null, CRegRep4.MIME_TYPE_EBRS_XML));
    // Add all attachments
    for (final MEPayload aPayload : aResponse.attachments ().values ())
      aMsg.addPayload (_createPayload (aPayload.getData ().bytes (), aPayload.getContentID (), aPayload.getMimeType ()));
    return _forwardMessage (aMsg, sDestURL);
  }

  @Nonnull
  public static ESuccess forwardMessage (@Nonnull final IncomingEDMErrorResponse aErrorResponse)
  {
    return forwardMessage (aErrorResponse, TCConfig.MEM.getMEMIncomingURL ());
  }

  @Nonnull
  public static ESuccess forwardMessage (@Nonnull final IncomingEDMErrorResponse aErrorResponse, @Nonnull @Nonempty final String sDestURL)
  {
    final TCIncomingMessage aMsg = new TCIncomingMessage ();
    aMsg.setMetadata (_createMetadata (aErrorResponse.getMetadata (), TCPayloadType.ERROR_RESPONSE));
    aMsg.addPayload (_createPayload (aErrorResponse.getErrorResponse ().getWriter ().getAsBytes (), null, CRegRep4.MIME_TYPE_EBRS_XML));
    return _forwardMessage (aMsg, sDestURL);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy